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ブロックの前にExceptionのキャッチを追加します。これにより、例外が「失われる」ことはありません(最初にブロックがありました)私のコードでは、スローできるバイト読み取りがありましたIOException)。

ヒントの開発に関しては、今日行く非常に素晴らしいチュートリアルを見つけました。うまくいけば、実用的なヒントが得られるでしょう(以下のリンク)。リンクの皆さん(@JonSkeetと@Nambari)に感謝します。彼らは、ヒントの開発についてさらに知るのに非常に役立ちました。

NetBeansJavaヒントモジュールチュートリアル。

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が自動アンボックス化について警告することも望まない場合もあります...しかし、少なくとも最初に何が起こっているかを確認する価値があります:)

自動ボクシング/アンボクシングとvarargsを強調表示するプラグインを見つけましたが、それは非常に古く、使用しているバージョンではサポートされていない可能性があります。

これはコンパイラオプションとして構成可能であると思いますが(Eclipseにあります)、NetBeansの経験が十分ではありません

于 2012-10-15T15:49:34.107 に答える