Việc sử dụng phương thức printStackTrace () trong Java là gì?


97

Tôi đang xem qua một chương trình ổ cắm. Trong đó, printStackTraceđược gọi trên IOExceptionđối tượng trong khối bắt.
Không gì printStackTrace()thực sự làm gì?

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

Tôi không biết về mục đích của nó. Cái này được dùng để làm gì?


47
Một trong những tính năng mạnh mẽ nhất của IDE hiện đại là khả năng tra cứu tài liệu (gọi là javadoc) cho một phương thức Java nhất định. Trong Eclipse, nó là Shift-F2 khi con trỏ được đặt trên tên phương thức printStackTrace.
Thorbjørn Ravn Andersen

2
Có vẻ như bạn chưa quen với Java. Dưới đây là một cái gì đó để đọc: today.java.net/article/2006/04/04/...
TJR

Bạn cũng có thể đọc mã printStackTrace () để xem chính xác chức năng và cách thức hoạt động của nó.
Peter Lawrey

1
Tôi thường thấy mô hình này bên trong các khối bắt: e.printStackTrace(); System.exit(1); Ở đây tôi muốn hỏi câu hỏi tương tự như OP, nhưng theo một cách khác: Mục đích chính xác của việc này là gì? JRE sẽ không tự động in ngăn xếp và thoát ra, khi ngoại lệ được ném ra? Tức là, thực sự không có nhiều "Xử lý ngoại lệ" đang diễn ra ở đây, phải không ??
Owen

1
Nó cũng nói chung là một ý tưởng rất xấu , vì nó ngăn chặn các ngoại lệ - không may đó là những gì Eclipse và IDE khác thường tự động đề nghị là cơ quan cho khối catch, vì vậy nó được sử dụng cho đến nay thường xuyên hơn nó nên được.
dimo414

Câu trả lời:


99

Đó là một phương thức trên các Exceptioncá thể in dấu vết ngăn xếp của cá thể đó tớiSystem.err .

Đó là một công cụ rất đơn giản, nhưng rất hữu ích để chẩn đoán các trường hợp ngoại lệ. Nó cho bạn biết điều gì đã xảy ra và điều này đã xảy ra ở đâu trong mã.

Dưới đây là một ví dụ về cách nó có thể được sử dụng trong thực tế:

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

2
Và nhờ các ngoại lệ đã kiểm tra, nó có thể là nội dung số 1 của catchcác khối :-)
Joey

3
@Joey Hoặcthrow new RuntimeException(e)
Bart van Heukelom

3
tuy nhiên nó được coi là hành vi xấu vì nó không an toàn. Sử dụng câu lệnh ghi nhật ký và đưa nó vào đó.
Karidrgn

40

Tôi cũng rất tò mò về điều này, vì vậy tôi chỉ tập hợp một mã mẫu nhỏ để bạn có thể xem nó đang làm gì:

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

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

Kêu gọi println(e):

java.lang.NullPointerException

Kêu gọi e.printStackTrace():

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

Điều này là bình thường, với lần đầu tiên bạn gọi toString () của lỗi, và trong lần thứ hai bạn yêu cầu in tất cả stackTrace từ lỗi. Đó là 2 điều khác biệt.
Jon

1
System.err.println(e);sẽ thích hợp hơn.
roottraveller

14

Nó giúp theo dõi ngoại lệ. Ví dụ: bạn đang viết một số phương thức trong chương trình của mình và một trong các phương pháp của bạn gây ra lỗi. Sau đó, printstack sẽ giúp bạn xác định phương pháp nào gây ra lỗi. Stack sẽ giúp như thế này:

Đầu tiên phương thức chính của bạn sẽ được gọi và chèn vào ngăn xếp, sau đó phương thức thứ hai sẽ được gọi và chèn vào ngăn xếp theo thứ tự LIFO và nếu có bất kỳ lỗi nào xảy ra ở đâu đó bên trong bất kỳ phương thức nào thì ngăn xếp này sẽ giúp xác định phương thức đó.


11

printStackTrace()giúp lập trình viên hiểu được vấn đề thực sự xảy ra ở đâu. printStacktrace()là một phương pháp của lớp Throwablecủa java.langgói. Nó in một số dòng trong bảng điều khiển đầu ra. Dòng đầu tiên bao gồm một số chuỗi. Nó chứa tên của lớp con Throwable và thông tin gói. Từ dòng thứ hai trở đi, nó mô tả vị trí lỗi / số dòng bắt đầu bằngat .

Dòng cuối cùng luôn mô tả điểm đến bị ảnh hưởng bởi lỗi / ngoại lệ. Dòng cuối cùng thứ hai thông báo cho chúng ta về dòng tiếp theo trong ngăn xếp nơi điều khiển đi sau khi nhận được chuyển từ số dòng được mô tả ở dòng cuối cùng. Các lỗi / ngoại lệ đại diện cho đầu ra dưới dạng một ngăn xếp, được đưa vào ngăn xếp theo fillInStackTrace()phương thức của Throwablelớp, chính nó sẽ điền vào chi tiết chuyển điều khiển chương trình vào ngăn xếp thực thi. Các dòng bắt đầu bằngat , không là gì ngoài các giá trị của ngăn xếp thực thi. Bằng cách này, lập trình viên có thể hiểu được vấn đề thực sự nằm ở đâu trong mã.

Cùng với printStackTrace()phương pháp, bạn nên sử dụng e.getmessage().


6

printStackTrace()in các vị trí xảy ra ngoại lệ trong mã nguồn, do đó cho phép tác giả đã viết chương trình biết được điều gì đã xảy ra. Nhưng vì nó cho thấy các vấn đề trong mã nguồn, (những) người dùng có thể có hoặc không có bất kỳ kinh nghiệm viết mã nào có thể không hiểu được điều gì đã xảy ra, vì vậy nếu chương trình cho phép người dùng gửi thông báo lỗi đến các tác giả, người dùng có thể không cung cấp dữ liệu tốt về những gì đã xảy ra.

Bạn nên xem xét Logger.getLogger()phương pháp này, nó cung cấp cơ sở xử lý ngoại lệ (ghi nhật ký) tốt hơn, và bên cạnh đó, printStackTrace()không có đối số được coi là lỗi thời và CHỈ nên được sử dụng cho mục đích gỡ lỗi, không phải hiển thị cho người dùng.


2

Việc printStackTrace()này giúp lập trình viên hiểu được vấn đề thực sự xảy ra ở đâu. Các printStackTrace()phương pháp là một thành viên của lớp Throwabletrong java.langgói.


2

printStackTracelà một phương thức của Throwablelớp. Phương pháp này hiển thị thông báo lỗi trong bảng điều khiển; nơi chúng tôi nhận được ngoại lệ trong mã nguồn. Các phương thức này có thể được sử dụng với khối catch và chúng mô tả:

  1. Tên của ngoại lệ.
  2. Mô tả ngoại lệ.
  3. Vị trí của ngoại lệ trong mã nguồn.

Ba phương thức mô tả ngoại lệ trên bảng điều khiển (trong đó printStackTrace là một trong số chúng) là:

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

Thí dụ:

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 () giúp lập trình viên hiểu được vấn đề thực sự xảy ra ở đâu. Nó giúp theo dõi ngoại lệ. nó là phương thức printStackTrace () của lớp Throwable được mọi lớp ngoại lệ kế thừa. Phương thức này in ra cùng một thông báo của đối tượng e và cả số dòng nơi xảy ra ngoại lệ.

Sau đây là một ví dụ khác về ngăn xếp in của Ngoại lệ trong 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: Đây là Ngoại lệ mới trong Java ... tại ClassName.methodName (fileName: 5)


0

Việc sử dụng phương thức e.printStackTrace () trong Java là gì?

Mục đích của việc sử dụng phương pháp e.printStackTrace();này là để xem sai chính xác là gì.

Ví dụ, chúng tôi muốn xử lý một ngoại lệ. Hãy xem ví dụ sau.

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();
    }
  }
}

Tôi đã sử dụng phương pháp e.printStackTrace();để hiển thị chính xác những gì là sai.

Trong đầu ra, chúng ta có thể thấy kết quả sau.

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

Xem hình ảnh tại đây

printStackTrace() cho biết bạn đang gặp lỗi ở dòng nào bất kỳ lý do tại sao bạn gặp lỗi.

Thí dụ:

 java.lang.ArithmeticException: / by zero
    at MinNumber.main(MinNumber.java:8) 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.