
今天在查看 Google 的 Android API ,关于蓝牙相关文档。发现下面这个写法比较奇怪,很好奇其中的用意,请大神们点评。
private class ConnectedThread extends Thread {
private final BluetoothSocket mmSocket; private final InputStream mmInStream; private final OutputStream mmOutStream; public ConnectedThread(BluetoothSocket socket) { mmSocket = socket; InputStream tmpIn = null; OutputStream tmpOut = null; // Get the input and output streams, using temp objects because // member streams are final try { tmpIn = socket.getInputStream(); tmpOut = socket.getOutputStream(); } catch (IOException e) { } mmInStream = tmpIn; mmOutStream = tmpOut; }
在构造函数里面,给 mmInStream 赋值的时候为何要用 tmpIn 的局部变量赋值,而不是直接只用 mmInStream = socket.getInputStream(); 虽然有注释,但还是没写到核心,这种写法有啥好处,大神们快来解答解答...
1 sorra Aug 31, 2016 我推测是如果抛异常就两个都不赋值。否则会出现一个有值一个没值的情况。 话说,竟然悄悄吞异常? |
2 感觉似乎就是为了处理抛异常时, mmlnStream 被初始化为指向异常的对象。然而并没有处理异常 是不是忘记了。 |
3 ovear Aug 31, 2016 因为不这么写。。编译过不去。。。可能尚未初始化变量。。。 |
4 SoloCompany Aug 31, 2016 via iPhone 注释即原因 |
5 21grams Aug 31, 2016 via Android 因为初始化语句有可能因为异常而未被执行 |
6 Cbdy Aug 31, 2016 via Android 因为 final 修饰的“变量”必须初始化。在声明、初始化块、构造方法中初始化都可以。 try 语句可能导致初始化失败,所以先给一个 null 。换成 if 啥的可能导致空指针的都要做一个预防。如果不想这样做,把置 null 放 finally 处理也是可以的(建议试试看)。 |
9 bqbkbz Sep 1, 2016 http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.3.1.2 A blank final instance variable must be definitely assigned at the end of ever constructor of the class in which it is declared; otherwise a compile-time error occurs. |