在以下代码中分配临时变量有什么用?如果我直接使用mmServerSocket会有什么不同。为什么我将mmServerSocket初始化为最终版?
private class AcceptThread extends Thread {
private final BluetoothServerSocket mmServerSocket;
public AcceptThread() {
// Use a temporary object that is later assigned to mmServerSocket,
// because mmServerSocket is final
BluetoothServerSocket tmp = null;
try {
// MY_UUID is the app's UUID string, also used by the client code
tmp = mBluetoothAdapter.listenUsingRfcommWithServiceRecord(NAME, MY_UUID);
} catch (IOException e) { }
mmServerSocket = tmp;
}
答案 0 :(得分:0)
这确保mmServerSocket
肯定只赋值一次,这是构造函数必须满足final
实例变量的要求。看起来似乎可以避免一个临时变量,如下所示:
try {
mmServerSocket = mBluetoothAdapter.listenUsingRfcommWithServiceRecord(NAME, MY_UUID);
} catch (IOException e) {
mmServerSocket = null;
}
但是,编译器会抱怨catch
块中的分配可能已经分配了mmServerSocket
。我不知道为什么编译器在这种情况下无法弄清楚一旦方法调用返回就不会出现异常,但这就是它的方式。
答案 1 :(得分:0)
这只是糟糕的代码。
mmServerSocket
变量不一定是最终的。BluetoothServerSocket
而不用这么大惊小怪。IOException
,而不是默默地失败并吃掉异常并留下一个零变量,以便以后导致NPE。