1

我的代码中有一个严重的错误,幸运的是我发现了:),因为我忘记更改方法的返回类型签名(从 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),他们在寻找更多关于提示开发的信息方面非常有用。

NetBeans Java 提示模块教程。

4

1 回答 1

1

确实抛出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 在自动拆箱时发出警告……但至少值得先检查一下发生了什么 :)

我找到了一个突出显示自动装箱/拆箱和可变参数的插件,但它非常旧,您使用的版本可能不支持。

希望这可以作为编译器选项进行配置(它在 Eclipse 中),但我没有足够的 NetBeans 经验来多说。

于 2012-10-15T15:49:34.107 回答