Java ME で例外スタック トレースのテキストを取得するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/225489

  •  03-07-2019
  •  | 
  •  

質問

通常の Java では、PrintWriter を printStackTrace に渡すことでスタック トレースのテキストを取得できます。私はこれに対する答えを知っているような気がします(すなわち、「いいえ」)しかし、

JavaMEのスタックトレースのテキストを文字列として取得する方法はありますか?

アップデート:

CLDC 1.0 に制限されていることに注意してください。

役に立ちましたか?

解決

私の知る限り、特定のプラットフォームがデフォルトの System.err ストリームをオーバーライドする手段を提供しない限り、スタック トレースを文字列値として取得する方法はありません。BlackBerry プラットフォームでは、スタック トレースがスローされます。 catch(Exception) メモリを節約するためですが、これは行われません catch(Throwable) また、デバイス イベント ログを通じてスタック トレースにアクセスできるようになります。

私が最終的にやったことは、可能な限り最後の瞬間に例外ではなくThrowableをキャッチし、そこからスタックトレースを出力することです。もちろん、これにはあなたも巻き込まれる危険があります java.lang.Error これはあまり良くありません、特に OutOfMemoryError, 、への呼び出しですが、 System.gc() 印刷する前にスタック トレースを実行するとリスクが軽減されるようで、これに関して問題は発生していません。

私は、あなたがターゲットとしているプラ​​ットフォームを調べて、どこかで System.err にアクセスできるかどうかを確認します。デバッガはいつでも接続でき、コンソール出力に表示されるはずですが、「フィールドで」スタック トレースを取得しているように聞こえます。

他のヒント

2つのソリューション:

  • エミュレータで例外を再現します。ワイヤレスツールキットとNetbeansは、コンピューターにスタックトレースを出力します。

  • Symbianデバイスを使用します。

シリーズ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://&quot ;, Connector.READ)によって返された接続からInputStreamを開きます。その後、Symbian電話で例外スタックトレースをキャプチャできます。

編集:" redirect://" Series60 5th editionに戻って" redirect:// test" Series60 3rd edition feature pack 2で動作するはずです

CLDC 1.0でこれを行う方法はありません。ただし、一部のデバイス/ OSでは、基になるExceptionクラスがスタックトレースにアクセスする方法を提供している場合があります(新しいCLDCバージョンを考えてください)。リフレクションを使用して実行時に例外インスタンスを検査し、ターゲットプラットフォームでどのメンバーが公開されているかを確認します。その後、そのような情報を提供するプラットフォームでスタックトレースを安全に抽出できるコードを作成できます。

CLDCでも適切なスタックトレースを記録するために使用できるツールを作成しました。 http://jarrut.sourceforge.net で確認してください。それはまだ非常に新しく、いくつかのラフなエッジを持っているかもしれませんが、それは私のために機能し、それなしでMIDletを開発することはもう想像できませんでした。それを使用する最良の方法は、それをマイクロログと結合することです。

残念ながら、ツールには現在CLDC 1.1が必要であるため、元のポスターの問題を解決できない可能性があります。

PrintWriterでByteArrayOutputStreamに書き込み、バイトから文字列を再構築できます。

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で利用可能であると主張しているが、他のプロファイルについては何も言っていない。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top