我的代码中有一个严重的错误,幸运的是我发现了:),因为我忘记更改方法的返回类型签名(从 int 到 Integer)并且我的应用程序在没有任何警告的情况下崩溃。
我有以下方法:
public static int getDataSourceIdForName(String name) {
Integer i = dsNameToIdMap.get(name);
return i;
}
它使我的应用程序崩溃。我观察到它只有在发生特殊情况并且name
实际上不在地图(Map<String, Integer> dsNameToIdMap = new HashMap<>()
)中时才会崩溃,因此它返回 null。我希望一个正在运行的应用程序会抛出一个NullPointerException
错误,但事实并非如此,该应用程序简直快死了,我有一个充满兴奋的旅程来找到这个错误 :)
因为我希望我的 IDE 支持在未来避免这些情况,所以我问你们如何设置NetBeans
以警告这些情况,即当我在返回签名是原始类型的函数中返回对象时,因为我我自己无法弄清楚。
更新:
我发现了真正的问题。正如 Jon 正确论证的那样,代码实际上是在抛出NullPointerException
:) 只有我的客户“生存机制”才隐藏它,正如您在下面的示例中看到的那样:
public class WhyNoNullPointerException {
private static int test() {
Integer i = null;
return i;
}
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("i = " + i);
if (i == 10) {
try{
test();
}finally{
run();
}
}
}
}
});
t.setDaemon(true);
t.start();
Thread.sleep(1111);
}
}
由于程序最终试图通过重新启动其主操作循环来保持活力,因此它“隐藏”了NullPointerException
.
为了避免将来出现这种情况,我现在总是在这个自我重启的代码中,在 finally 块之前添加一个 catch 作为一个好习惯,这样异常就不会“丢失”(我首先在我的代码在那里读取了一个字节,可以抛出IOException
)。
至于提示的开发,我发现了一个非常好的教程,我今天将学习它,希望会有一个工作提示(下面的链接)。感谢您的链接家伙(@JonSkeet 和@Nambari),他们在寻找更多关于提示开发的信息方面非常有用。