Javaプログラムでは、現在、プログラムの特定の時点で「未処理の例外」が発生しており、これが生成されている場所を特定できないようです。
プログラムには送受信されたワイヤレスデータバイトを処理するストリームが含まれているため、コードのデバッグも困難です。デバッガーでそれをシミュレートすることはできないようです。
例外を見つけるためにどのような戦略を採用する必要がありますか?
Javaプログラムでは、現在、プログラムの特定の時点で「未処理の例外」が発生しており、これが生成されている場所を特定できないようです。
プログラムには送受信されたワイヤレスデータバイトを処理するストリームが含まれているため、コードのデバッグも困難です。デバッガーでそれをシミュレートすることはできないようです。
例外を見つけるためにどのような戦略を採用する必要がありますか?
Thread.UncaughtExceptionHandler
インターフェイスを実装し、setDefaultUncaughtExceptionHandler()
それを設定するために使用します。
礼儀としてのサンプルプログラム。複数のスレッドを使用している場合は、原因と思われるスレッドにハンドラーを設定することもできます。
public class Test {
public static void main(String args[]) {
new Test();
}
public Test() {
Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandler());
// or if a default handler is set you can also use setUncaughtExceptionHandler
// check the javadocs for the specifics
throw new RuntimeException ("You can't get me or can you?");
}
class MyUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler {
public void uncaughtException(Thread t, Throwable e) {
System.err.println ("Uncaught exception by " + t + " caught:");
e.printStackTrace();
}
}
}
スタックトレースがない場合、多くのことを行うことはできません。
それが実際に反対側で発生し、これをメッセージとして受信した場合は、スタックトレースまたは同様の情報を反対側に要求する必要があります。
編集:もちろん、独自のコードが次のような例外を飲み込んでいないことを確認する必要があります。
} catch (Exception e) {
// Do nothing.
}
また
} catch (Exception e) {
System.out.println("Error");
}
また
} catch (Exception e) {
System.out.println(e.toString());
}
例外から最大限の情報を得るには、少なくとも次のことを行う必要があります。
} catch (Exception e) {
e.printStackTrace();
}
あるいは単に
} catch (Exception e) {
throw e;
}
お役に立てれば。
コードのセクションの周りにtry-catch(Exception ex)ブロックを配置し、ブロックを移動/強化して、スローされた例外をログに記録させることができます。コードが多すぎない限り、数回の実行でコードを追跡できるはずです。
しかし、プログラムを実行すると、デバイスに「未処理の例外」と表示され、アプリを閉じるかどうかを尋ねられます。
まず、このメッセージを生成しているコード内の場所を見つける必要があります。アプリにはGUIなどがあるように思われるので、なんらかのダイアログが可能です。
次に、メッセージ/ダイアログが作成される原因となっているコード内の場所を見つけます。どちらかである可能性が高い
try
/ブロック、またはcatch
Exception
Throwable
UncaughtExceptionHandler
。_いずれの場合も、次のことは、キャッチされていない例外のスタックトレースをアプリに出力させるコードを追加することです。ex
それが例外オブジェクトへの参照を保持していると仮定します。
ex.printStackTrace();
スタックトレースを標準エラーストリームに書き込みます。例:「コンソール」。(「コンソール」出力の行き先が見つからない場合は、より重いソリューションがあります。)
どこかでチェックされていないRuntimeExceptionが発生しているようです。try {} catch(Throwable t){t.printStackTrace();を使用して、main()メソッドで簡単に試すことができます。}
または、EclipseなどのIDEを使用してリモートでデバッグする場合は、「キャッチされない例外で一時停止」を使用して、Java例外ブレークポイントでデバッガーをトリガーするように設定できます。ここにいくつかのドキュメントがあります。