通常の Java では、PrintWriter を printStackTrace に渡すことで、スタック トレースのテキストを取得できます。これに対する答え(つまり「いいえ」)はわかっている気がしますが、
JavaME でスタック トレースのテキストを文字列として取得する方法はありますか?
アップデート:
私はCLDC 1.0に制限されていることに言及する必要があります
2 つのソリューション:
エミュレータで例外を再現します。ワイヤレス ツールキットと Netbeans は、コンピューターにスタック トレースを出力します。
Symbian デバイスを使用します。
Series 60 第 3 版の Feature Pack 2 より前では、Symbian ハンドセットは Sun Hotspot Java 仮想マシンを使用しています。C 標準ライブラリの部分的な実装にリンクすることで、Symbian OS に適合されました。
これにより、Symbian はリダイレクタと呼ばれる C++ プログラムを作成できました。このプログラムは、Java 例外スタック トレースを含む、VM の標準出力と標準エラーをキャプチャすることができました。
C++ リダイレクタは、Symbian OS のバージョン 9 用にアップグレードされていません。代わりに、「redirect://」GCF プロトコルが VM に導入されました。
別の MIDlet から、Connector.open("redirect://", Connector.READ); によって返された接続から InputStream を開きます。その後、Symbian 電話で例外スタック トレースをキャプチャできます。
編集 : 「redirect://」は Series60 第 5 版に戻り、「redirect://test」は Series60 第 3 版の機能パック 2 で動作するはずです
特定のプラットフォームがデフォルトの System.err ストリームをオーバーライドする手段を提供しない限り、スタック トレースを文字列値として取得する方法はありません。BlackBerry プラットフォームでは、catch(Exception)
メモリを節約するためにスタック トレースをスローしますが、これを行わずcatch(Throwable)
、デバイス イベント ログからスタック トレースにアクセスできるようにします。
私がやったことは、可能な限り最後の瞬間に Exception ではなく Throwable をキャッチし、そこからスタックトレースを出力することです。java.lang.Error
もちろん、これにはあまり良くないものをキャッチする危険性もOutOfMemoryError
あります。特にSystem.gc()
.
あなたがターゲットにしているプラットフォームを調べて、どこかで System.err にアクセスできるかどうかを確認します。デバッガーはいつでも接続でき、コンソール出力に表示されるはずですが、「現場で」スタック トレースを取得した後のように聞こえます。
CLDC1.0でそれを行う方法があるとは思いません。ただし、一部のデバイス/ OSでは、基盤となるExceptionクラスがスタックトレースにアクセスする方法を提供している可能性があります(新しいCLDCバージョンを考えてみてください)。リフレクションを使用して実行時に例外インスタンスを検査するだけで、ターゲットプラットフォームでどのメンバーを公開するかを確認できます。次に、そのような情報を提供するプラットフォームでスタックトレースを安全に抽出できるコードを記述できます。
CLDC でも適切なスタック トレースをログに記録するために使用できるツールを作成しました。http://jarrut.sourceforge.netで確認してください。これはまだ非常に新しく、荒削りな部分があるかもしれませんが、私にとってはうまく機能し、これなしで MIDlet を開発することはもう想像できませんでした。それを使用する最良の方法は、microlog と組み合わせることです。
残念ながら、このツールは現在 CLDC 1.1 を必要とするため、元のポスターの問題を解決できない可能性があります。
PrintWriter で ByteArrayOutputStream に書き込み、バイトから String を再構築することができます。
try{
throw new Exception("Message");
} catch (Exception ex){
ByteArrayOutputStream out = new ByteArrayOutputStream();
ex.printStackTrace(new PrintStream(out));
System.out.println(new String(out.toByteArray()));
}
きれいではありませんが、ほとんどどこでも機能するはずです。上記を試す前に、[Throwable#getStackTrace]( http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Throwable.html#getStackTraceにアクセスできないことを確認してください。())、Eclipse は CDC/Foundation 1.1 で利用可能であると主張していますが、それは他のプロファイルについては何も述べていません。