我的代码中有一个严重的错误,幸运的是我发现了:),因为我忘记更改方法的返回类型签名(从 int 到 Integer),并且我的应用程序在没有任何警告的情况下崩溃了。
我有以下方法:
public static int getDataSourceIdForName(String name) {
Integer i = dsNameToIdMap.get(name);
return i;
}
它使我的应用程序崩溃了。我观察到只有当特殊情况发生并且 name
时它才会崩溃。实际上不在 map 中( Map<String, Integer> dsNameToIdMap = new HashMap<>()
),因此它返回 null。我希望正在运行的应用程序抛出 NullPointerException
但事实并非如此,该应用程序简直快要死了,我满怀兴奋地寻找这个错误:)
由于我希望我的 IDE 能够支持我避免将来出现这些情况,所以我问你们如何设置 NetBeans
警告这些情况,即当我在返回签名是原始类型的函数中返回对象时,因为我自己无法弄清楚。
更新:
我已经找到了真正的问题。该代码实际上抛出 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);
}
}
由于程序最终试图通过重新启动其主操作循环来保持 Activity 状态,因此它“隐藏”了 NullPointerException
.
为了避免将来出现这种情况,我现在总是会在这个自重启代码中,在finally block 之前添加一个异常捕获作为一个好的实践,这样异常就不会“丢失”(我在代码中首先有这个 block ,我在那里读取了一个字节,它可能会抛出 IOException
)。
关于提示的开发,我发现了一个非常好的教程,我今天将学习该教程,希望能有一个有效的提示(下面的链接)。感谢您的链接(@JonSkeet 和 @Nambari),他们对于找到更多有关提示开发的信息非常有用。
最佳答案
它确实确实抛出NullPointerException
:
import java.util.*;
public class Test {
private static final Map<String, Integer> map
= new HashMap<String, Integer>();
public static void main(String[] args) {
getInt("Foo");
}
public static int getInt(String name) {
Integer i = map.get(name);
return i;
}
}
结果:
c:\Users\Jon\Test>java Test
Exception in thread "main" java.lang.NullPointerException
at Test.getInt(Test.java:13)
at Test.main(Test.java:8)
现在您可能也希望 NetBeans 在自动拆箱时发出警告...但至少值得先检查一下发生了什么:)
我找到了plugin其中突出显示了自动装箱/拆箱和可变参数,但它非常旧,您正在使用的版本很可能不支持。
我希望可以将其配置为编译器选项(在 Eclipse 中),但我没有足够的 NetBeans 经验,无法多说。
关于java - 设置 NetBeans 提示以在使用 int 签名的方法返回 Integer 时发出警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12899169/