JavaでのprintStackTrace()メソッドの使用は何ですか?


97

ソケットプログラムを使用しています。その中で、catchブロックのオブジェクトでprintStackTrace呼び出されIOExceptionます。実際には
何をしprintStackTrace()ますか?

catch(IOException ioe)
{
    ioe.printStackTrace();
}

私はその目的を知りません。何に使うの?


47
最新のIDEの最も強力な機能の1つは、特定のJavaメソッドのドキュメント(javadocと呼ばれる)を検索する機能です。Eclipseでは、printStackTraceメソッド名にカーソルを合わせるとShift-F2になります。
–ThorbjørnRavn Andersen、2010

2
Javaは初めてのようですね。読むためにここでの何か:today.java.net/article/2006/04/04/...
TJR

また、printStackTrace()のコードを読んで、何がどのように行われるかを正確に確認することもできます。
Peter Lawrey

1
私はよくこのパターンをcatchブロック内で見ます。e.printStackTrace(); System.exit(1); ここでは、OPと同じ質問をしたいと思いますが、別の方法で行います。これの正確な目的は何ですか?例外がスローされたときに、JREは自動的にスタックトレースを出力して終了しませんか?つまり、ここで行われている「例外処理」はそれほど多くありませんよね??
オーウェン

1
また、例外を抑制しているため、一般的には非常に悪い考えです。残念ながら、Eclipseや他のIDEは、多くの場合、catchブロックの本体として自動的に提案するため、本来よりもはるかに頻繁に使用されます。
dimo414 2017

回答:


99

これは、インスタンスのスタックトレースExceptionをに出力するSystem.errインスタンスのメソッドです。

非常にシンプルですが、例外を診断するための非常に便利なツールです。何が起こったのか、コードのどこで起こったのかがわかります。

これが実際にどのように使用されるかの例です:

try {
    // ...
} catch (SomeException e) { 
    e.printStackTrace();
}

2
そして、チェックされた例外のおかげで、それはおそらくcatchブロックの#1コンテンツです:-)
Joey

3
@ジョーイ・オアthrow new RuntimeException(e)
バート・ファン・ヒューケロム

3
ただし、スレッドセーフではないため、これは悪い習慣と見なされます。ロガーステートメントを使用して、そこに含めます。
Karidrgn 2018年

40

私もこれに少し興味があったので、それが何をしているかを確認できる小さなサンプルコードをまとめました:

try {
    throw new NullPointerException();
}
catch (NullPointerException e) {
    System.out.println(e);
}

try {
    throw new IOException();
}
catch (IOException e) {
    e.printStackTrace();
}
System.exit(0);

呼び出しprintln(e)

java.lang.NullPointerException

呼び出しe.printStackTrace()

java.io.IOException
      at package.Test.main(Test.java:74)

これは正常で、1つ目はエラーのtoString()を呼び出し、2つ目はエラーからすべてのstackTraceを出力するように要求します。これは2つの異なる点です。
ジョン

1
System.err.println(e);より適切になります。
roottraveller 2017

14

例外の追跡に役立ちます。たとえば、プログラムにいくつかのメソッドを記述していて、そのメソッドの1つがバグを引き起こしているとします。次に、printstackは、バグの原因となっている方法を特定するのに役立ちます。スタックはこのように役立ちます:

最初にメインメソッドが呼び出されてスタックに挿入され、次に2番目のメソッドが呼び出されてLIFOの順序でスタックに挿入されます。エラーがメソッド内のどこかで発生した場合、このスタックはそのメソッドの識別に役立ちます。


11

printStackTrace()プログラマが実際の問題が発生した場所を理解するのに役立ちます。パッケージprintStacktrace()のクラスThrowableのメソッドですjava.lang。出力コンソールに数行を出力します。最初の行はいくつかの文字列で構成されています。これには、Throwableサブクラスの名前とパッケージ情報が含まれています。2行目以降は、で始まるエラー位置/行番号を記述していますat

最後の行は常に、エラー/例外の影響を受ける宛先を示しています。最後の2行目は、スタックの次の行について通知します。最後の行に記述されている行番号から転送が取得された後、コントロールが移動します。エラー/例外は、クラスのfillInStackTrace()メソッドによってスタックに供給されたスタックの形式で出力を表しThrowable、それ自体がプログラム制御転送の詳細を実行スタックに書き込みます。で始まる行atは、実行スタックの値にすぎません。このようにして、プログラマーはコードのどこに実際の問題があるかを理解できます。

printStackTrace()メソッドとともに、を使用することをお勧めしますe.getmessage()


6

printStackTrace()例外が発生した場所をソースコードに出力します。これにより、プログラムを作成した作成者は、問題の原因を確認できます。しかし、ソースコードに問題があるため、コーディングの経験の有無にかかわらず、問題の原因を理解できない可能性があります。そのため、プログラムでユーザーにエラーメッセージを送信して、ユーザーは、何が問題であったかに関する適切なデータを提供できない可能性があります。

Logger.getLogger()メソッドを検討する必要があります。これにより、優れた例外処理(ロギング)機能が提供されます。また、printStackTrace()引数なしの場合は廃止されたと見なされ、ユーザーの表示ではなくデバッグ目的でのみ使用する必要があります。


2

printStackTrace()は、プログラマが実際の問題が発生した場所を理解するのに役立ちます。printStackTrace()メソッドは、クラスのメンバーであるThrowablejava.langパッケージ。


2

printStackTraceThrowableクラスのメソッドです。このメソッドは、コンソールにエラーメッセージを表示します。ここで、ソースコードで例外を取得しています。これらのメソッドはcatchブロックで使用でき、以下について説明します。

  1. 例外の名前。
  2. 例外の説明。
  3. ソースコード内の例外の場所。

(printStackTraceがその1つである)コンソールの例外を説明する3つのメソッドは次のとおりです。

  1. printStackTrace()
  2. toString()
  3. getMessage()

例:

public class BabluGope {
    public static void main(String[] args) {
        try {
            System.out.println(10/0);
         } catch (ArithmeticException e) {
             e.printStackTrace();   
             // System.err.println(e.toString());
             //System.err.println(e.getMessage());  
         }
    }
}

1

printStackTrace()は、プログラマが実際の問題が発生した場所を理解するのに役立ちます。例外の追跡に役立ちます。これは、すべての例外クラスに継承されるThrowableクラスのprintStackTrace()メソッドです。このメソッドは、eオブジェクトと同じメッセージを出力し、例外が発生した行番号も出力します。

以下は、Javaの例外の印刷スタックの別の例です。

public class Demo {
   public static void main(String[] args) {
      try {
         ExceptionFunc();
      } catch(Throwable e) {
         e.printStackTrace();
      }
   }
   public static void ExceptionFunc() throws Throwable {
      Throwable t = new Throwable("This is new Exception in Java...");

      StackTraceElement[] trace = new StackTraceElement[] {
         new StackTraceElement("ClassName","methodName","fileName",5)
      };
      t.setStackTrace(trace);
      throw t;
   }
}

java.lang.Throwable:これはJavaの新しい例外です... at ClassName.methodName(fileName:5)


0

Javaでのe.printStackTrace()メソッドの使用は何ですか?

さて、このメソッドを使用する目的は、e.printStackTrace();何が間違っているのかを確認することです。

たとえば、例外を処理したいとします。次の例を見てみましょう。

public class Main{

  public static void main(String[] args) {

    int a = 12;
    int b = 2;

    try {
       int result = a / (b - 2);
       System.out.println(result);
    }

    catch (Exception e)
    {
       System.out.println("Error: " + e.getMessage());
       e.printStackTrace();
    }
  }
}

私はe.printStackTrace();何が悪いのかを正確に示すためにメソッドを使用しました。

出力では、次の結果を確認できます。

Error: / by zero

java.lang.ArithmeticException: / by zero

  at Main.main(Main.java:10)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  at java.lang.reflect.Method.invoke(Method.java:498)
  at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

-1

画像はこちら

printStackTrace() エラーが発生している行を、エラーが発生している理由を通知します。

例:

 java.lang.ArithmeticException: / by zero
    at MinNumber.main(MinNumber.java:8) 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.