コードに重大なバグがありましたが、幸いなことに:)メソッドの戻り型シグネチャを変更するのを忘れて(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)に感謝します。彼らは、ヒントの開発についてさらに知るのに非常に役立ちました。