Java에서 printStackTrace () 메서드를 사용하는 방법은 무엇입니까?


98

소켓 프로그램을 진행 중입니다. 그것 에서 catch 블록 printStackTraceIOException객체에 대해 호출됩니다 . 실제로
무엇을 printStackTrace()합니까?

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

나는 그 목적을 알지 못한다. 그것은 무엇을 위해 사용됩니까?


47
최신 IDE의 가장 강력한 기능 중 하나는 주어진 Java 메소드에 대한 문서 (javadoc이라고 함)를 조회하는 기능입니다. Eclipse에서 커서가 printStackTrace 메소드 이름에 위치하면 Shift-F2입니다.
Thorbjørn Ravn Andersen

2
Java를 처음 사용하는 것 같습니다. 읽어야 할 것이 있습니다 : today.java.net/article/2006/04/04/…
TJR

printStackTrace ()의 코드를 읽고 정확히 무엇을하고 어떻게 하는지를 볼 수 있습니다.
Peter Lawrey 2010

1
나는 종종 catch 블록 안에서이 패턴 e.printStackTrace(); System.exit(1); 을 본다 . 여기서 나는 OP와 같은 질문을하고 싶지만 다른 맥락에서 : 정확히 이것의 목적은 무엇인가? 예외가 발생하면 JRE가 자동으로 stacktrace를 인쇄하고 종료하지 않습니까? 즉, 여기서는 "예외 처리"가별로 많지 않죠 ??
Owen

1
또한 예외를 억제하기 때문에 일반적으로 매우 나쁜 생각입니다 . 안타깝게도 Eclipse 및 기타 IDE가 종종 catch 블록의 본문으로 자동 제안하는 것이므로 예상보다 훨씬 더 자주 사용됩니다 .
dimo414 2017-04-13

답변:


100

Exception인스턴스 의 스택 추적인쇄하는 인스턴스 의 메서드입니다.System.err .

매우 간단하지만 예외를 진단하는 데 매우 유용한 도구입니다. 무슨 일이 있었는지, 코드에서이 일이 발생한 위치를 알려줍니다.

다음은 실제로 사용되는 방법의 예입니다.

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

2
그리고 체크 된 예외 덕분에 아마의 # 1 내용입니다 catch:-) 블록
조이

3
@Joey 또는throw new RuntimeException(e)
바트 밴 Heukelom

3
그러나 스레드로부터 안전하지 않기 때문에 나쁜 습관으로 간주됩니다. logger 문을 사용하고 거기에 포함 시키십시오.
Karidrgn

41

저도 이것에 대해 호기심이 많았습니다. 그래서 제가하는 일을 볼 수있는 작은 샘플 코드를 모았습니다.

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)

이것은 정상입니다. 첫 번째는 오류의 toString ()을 호출하고 두 번째에서는 오류에서 모든 stackTrace를 인쇄하도록 요청합니다. 그것은 2 개의 다른 것들입니다.
Jon

1
System.err.println(e);더 적절할 것입니다.
roottraveller

14

예외를 추적하는 데 도움이됩니다. 예를 들어 프로그램에 몇 가지 메서드를 작성하고 있고 메서드 중 하나가 버그를 유발합니다. 그런 다음 printstack은 버그를 일으키는 방법을 식별하는 데 도움이됩니다. 스택은 다음과 같이 도움이 될 것입니다.

먼저 메인 메소드가 호출되어 스택에 삽입되고, 두 번째 메소드가 호출되어 LIFO 순서로 스택에 삽입되며, 메소드 내부 어딘가에서 오류가 발생하면이 스택이 해당 메소드를 식별하는 데 도움이됩니다.


11

printStackTrace()프로그래머가 실제 문제가 발생한 위치를 이해하는 데 도움이됩니다. 패키지 printStacktrace()클래스 Throwable의 메서드입니다 java.lang. 출력 콘솔에 여러 줄을 인쇄합니다. 첫 번째 줄은 여러 문자열로 구성됩니다. Throwable 하위 클래스의 이름과 패키지 정보를 포함합니다. 두 번째 줄부터는 다음으로 시작하는 오류 위치 / 줄 번호를 설명합니다.at .

마지막 줄은 항상 오류 / 예외의 영향을받는 대상을 설명합니다. 두 번째 마지막 줄은 마지막 줄에 설명 된 줄 번호에서 전송 된 후 컨트롤이 이동하는 스택의 다음 줄에 대해 알려줍니다. 오류 / 예외는 스택 형식의 ​​출력을 나타내며, 이는 클래스의 fillInStackTrace()메서드에 의해 스택에 공급되었으며, Throwable자체적으로 프로그램 제어 전송 세부 정보를 실행 스택에 채 웁니다. 로 시작하는 줄 at은 실행 스택의 값일뿐입니다. 이런 식으로 프로그래머는 코드에서 실제 문제가 어디에 있는지 이해할 수 있습니다.

printStackTrace()방법 과 함께 e.getmessage().


6

printStackTrace()소스 코드에서 예외가 발생한 위치를 인쇄하므로 프로그램을 작성한 작성자가 무엇이 잘못되었는지 확인할 수 있습니다. 그러나 소스 코드에 문제가 있기 때문에 코딩 경험이 있거나없는 사용자는 무엇이 잘못되었는지 이해하지 못할 수 있습니다. 따라서 프로그램이 사용자가 작성자에게 오류 메시지를 보낼 수 있도록 허용하면 사용자는 무엇이 잘못되었는지에 대한 좋은 데이터를 제공하지 못할 수 있습니다.

Logger.getLogger()메소드를 고려해야 하며 더 나은 예외 처리 (로깅) 기능을 제공하며 printStackTrace()인수가없는 것 외에는 사용되지 않는 것으로 간주되며 사용자 표시가 아닌 디버깅 목적으로 만 사용해야합니다.


2

printStackTrace()프로그래머가 실제 문제가 발생한 위치를 이해하는 데 도움 이 됩니다. printStackTrace()방법은 클래스의 멤버 Throwablejava.lang패키지로 제공된다.


2

printStackTraceThrowable클래스 의 방법입니다 . 이 방법은 콘솔에 오류 메시지를 표시합니다. 소스 코드에서 예외가 발생합니다. 이러한 메서드는 catch 블록과 함께 사용할 수 있으며 다음을 설명합니다.

  1. 예외의 이름입니다.
  2. 예외에 대한 설명입니다.
  3. 소스 코드에서 예외 위치입니다.

콘솔에서 예외를 설명하는 세 가지 메서드 (printStackTrace가 그중 하나임)는 다음과 같습니다.

  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의 Exception 인쇄 스택의 또 다른 예입니다.

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의 새로운 예외입니다 ... 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.