繁体   English   中英

初始化内部类的最终实例变量

[英]Initialize the final instance variable of inner class

您好我想在它的构造函数中初始化内部类的最终变量,但是编译器强制我在声明时初始化它为什么有任何想法?

我该如何处理这种情况?

public MainActivity extends Activity {
    private class AcceptThread extends Thread {
            private final BluetoothServerSocket mBluetoothServerSocket;
            public AcceptThread() {
                try {
                    mBluetoothServerSocket = mBluetoothAdapter.listenUsingRfcommWithServiceRecord("BT_SERVER", UUID.fromString("a60f35f0-b93a-11de-8a39-08002009c666"));
                } catch (IOException e) { }
            }

            // Here methods
    }
}

看到这里回答我的问题在这里看起来很奇怪

在此输入图像描述

在此输入图像描述

在此输入图像描述

问题不是你试图在构造函数中初始化字段,而是你没有在catch块中初始化它。 编译器必须确保在退出构造函数之前始终初始化该字段。

不幸的是,简单地在catch块中分配一个回退值是行不通的,因为当编译器看到这样的代码时:

try {
    ...
    someFinalField = ...
    ...
} catch {
    ...
    someFinalField = ...
    ...
}

...然后它看到该字段初始化两次的可能性(一次在try块中,第二次在catch块中),这对于final字段是非法的。 在您的简单情况下,我们清楚地看到这是不可能的,因为在try块中初始化字段之前将始终抛出异常,但遗憾的是编译器不够聪明,无法理解。

您可以通过从catch块中抛出异常来满足编译器,这可能是您案例中的首选选项:

catch (IOException e) {
    throw new RuntimeException(e);
}

或者,使用非常流行的番石榴图书馆

catch (IOException e) {
    throw Throwables.propagate(e);
}

如果你真的想要吞下异常,那么 - 为了确保字段总是只被初始化一次,你必须将初始化移到try-catch块之外:

private class AcceptThread extends Thread {
    private final BluetoothServerSocket mBluetoothServerSocket;
    public AcceptThread() {
        BluetoothServerSocket localBluetoothServerSocket;
        try {
            localBluetoothServerSocket = ...
        } catch (IOException e) { 
            localBluetoothServerSocket = ...
        }
        mBluetoothServerSocket = localBluetoothServerSocket;
    }
}

这是因为它在try-block中,因此在所有情况下都不会实例化最终变量。

修改后的答案:要求将对象作为参数。 无论如何,在构造函数中工作通常不是一个好主意。

您的代码并不保证它初始化final字段。 如果发生异常,则捕获并忽略它,然后您尚未为最终字段分配任何值。

将您的代码更改为:

public AcceptThread() throws IOException {
    mBluetoothServerSocket = mBluetoothAdapter.listenUsingRfcommWithServiceRecord("BT_SERVER", UUID.fromString("a60f35f0-b93a-11de-8a39-08002009c666"));
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM