4

以下のコード スニペットでは、printStackTrace()メソッドは で呼び出されますcatch block。プログラムを実行すると、 が--> -->printStackTrace()の順に実行されるのではなく、連続して数回実行されることがあります。printStackTrace()catch blockfinally block

を に変更するstatic boolean bと、 が順番falseSystem.out.print(e)実行されます。

では、なぜ はprintStackTrace()異なる方法で動作するのでしょうか? (スレッドで何か??)

public class PrintStackTrace {
    static boolean b = true;
    public static void main(String[] args){
        for(int i = 0; i < 100; i++){
            try{
                throw new Exception("[" + i + "]");
            }
            catch(Exception e){
                if(b){
                    e.printStackTrace();
                }
                else{
                    System.out.print(e);
                }
                System.out.print(" Catch: " + i);
            }
            finally{
                System.out.print(" Finally: " + i);
            }
            System.out.println();
        }
    }
}
4

1 に答える 1

14

printStackTrace書き込みSystem.errながらSystem.out.println書き込みを行うためSystem.outです。System.errとの両方System.outが出力メッセージに同じ基本リソース (同じファイルまたは同じコンソールなど) を使用している場合でも、それらは異なる時点でフラッシュされます。

同期された出力が必要な場合は、例外も書き込みSystem.outます。

e.printStackTrace(System.out);

または、出力を共有リソースに既に同期しているロガーを使用すると、クラス、メソッド、日付と時刻、スレッド名など、メッセージに出力される内容についてより多くのオプションが提供されます。ログ メッセージの書き込みなどの利点があります。テキストファイルの代わりにデータベースに、など。

于 2014-05-11T01:55:42.930 に答える