我的软件在一段时间内运行良好,但在 Android 4 中出现了一些新问题。
(设备 Samsung Note 与 Android 4.0.4)
以下在其 on 线程中/上的某个循环内运行
try {
socket.connect(); // <-- this blocks for up to 6 sec
} catch (IOException e) { // <-- this was entered
try {
socket.close(); // <-- here the NPE happened
} catch (IOException ioe) {
//stuff
}
} catch (NullPointerException npe) {
//stuff
}
我体验到套接字在连接阻塞时可能变为空,但最近我什至在 IOEx 捕获块内发现它为空。所以连接抛出了一个 IOEx 而不是一个 NPE,所以套接字仍然在那里。在 catch 块内,socket.close() 然后抛出一个 NPE 使服务崩溃,因为我没有在那里使用 NPE catch。
恕我直言,将 NPE catch 块放在另一个需要对象首先处于活动状态的 catch 块中是没有意义的。
这一切在 android 4 中越来越多地发生,而且大多数时候服务(和应用程序)在后台运行了一段时间。它不是一个市场应用程序,所以如果它在按下主页按钮后仍然处于活动状态就可以了。但是一旦它在后台太久,(未连接的!)套接字似乎正在被gc'ed。
问题是:为什么会这样?除了内部 IOEx 之外,我真的应该放一个 NPE 吗?