2013-08-31 37 views
30

Làm cách nào để nhận được thông báo ngoại lệ đầy đủ trong Java?Theo dõi ngăn xếp dưới dạng Chuỗi

Tôi đang tạo một Ứng dụng Java. Nếu có ngoại lệ thời gian chạy, một JDialog có số JTextArea sẽ bật lên. Tôi cố gắng để tạo ra một ngoại lệ thời gian chạy trong ứng dụng của tôi, nhưng vùng văn bản thể hiện thông điệp ngoại lệ trông như thế này:

java.lang.ClassNotFoundException: com.app.Application 

Tuy nhiên, tôi muốn vùng văn bản của tôi để hiển thị một cái gì đó như:

enter image description here

Dưới đây là một số phần của mã của tôi được bao quanh bởi các trycatch:

String ex = e.toString(); 
this.addText(ex); 

tôi đã cố gắng để sử dụng e.getLocalizedMessage()e.getMessage(), nhưng cả hai đều không hoạt động.

+0

Kiểm tra câu trả lời được cập nhật mà tôi đã cung cấp. Bạn có thể nhận được dấu vết được chuyển thành định dạng chuỗi để bạn hiển thị. –

+1

sử dụng 'ExceptionObject.printStackTrace();' –

+0

Chỉ cần theo dõi ngăn xếp đến một phần chuỗi: http://stackoverflow.com/questions/1149703/how-can-i-convert-a-stack-trace-to-a-string –

Trả lời

68

Bạn cần phải gọi Throwable#printStackTrace(PrintWriter);

try{ 

}catch(Exception ex){ 
    String message = getStackTrace(ex); 
} 

public static String getStackTrace(final Throwable throwable) { 
    final StringWriter sw = new StringWriter(); 
    final PrintWriter pw = new PrintWriter(sw, true); 
    throwable.printStackTrace(pw); 
    return sw.getBuffer().toString(); 
} 

Bạn cũng có thể sử dụng commons-lang-2.2.jar thư viện Apache Commons Lang cung cấp chức năng này:

public static String getStackTrace(Throwable throwable) 
Gets the stack trace from a Throwable as a String. 

ExceptionUtils#getStackTrace()

+0

Nó hoạt động !!! Cảm ơn bạn đã nâng cao – Jeremy

+0

Tuyệt vời! Giúp tôi trong một lỗi InputStream trong Android :) – tvieira

1

Thử e.printStackTrace(), nó sẽ in dấu vết cho ngoại lệ của bạn với các dòng được đề cập

0

Đây là thông báo ngoại lệ đầy đủ.

Nếu bạn muốn biết thêm thông tin thử e.printStackTrace()

sau đó bạn sẽ nhận được excatly những gì bạn nhìn thấy trên hình ảnh bạn postet

3

nếu bạn không sử dụng bất kỳ logger (Log4j hoặc oracle logger api) sau đó bạn có thể sử dụng câu lệnh dưới đây để in thông điệp ngoại lệ đầy đủ

try{ 
     // statement which you want to monitor 

}catch(Exception e){ 
    e.printStackTrace() 
    // OR System.err.println(e.getStackTrace()); 
    // OR System.err.println(e); 
    // OR System.err.println(e.getMessage()); 
    // OR System.err.println(e.getCause()); 
} 

nếu bạn đang sử dụng API Logger sau đó sử dụng câu lệnh dưới đây

try{ 

     // statement which you want to monitor 

}catch(Exception e){ 
    log.error(e,e); 
} 
4

Để có được dấu vết ngăn xếp thành một chuỗi bạn có thể sử dụng những dòng này:

CharArrayWriter cw = new CharArrayWriter(); 
    PrintWriter w = new PrintWriter(cw); 
    e.printStackTrace(w); 
    w.close(); 
    String trace = cw.toString(); 
+0

mã của bạn không hoạt động ... – Jeremy

+0

Bạn nói đúng, hãy xem cập nhật. – Henry

+0

cảm ơn bạn, nó cũng hoạt động – Jeremy

0
public static String getStackMsg(Throwable e) { 
    StringBuffer sb = new StringBuffer(); 
    sb.append(e.toString()).append("\n"); 
    StackTraceElement[] stackArray = e.getStackTrace(); 

    for(int i = 0; i < stackArray.length; ++i) { 
     StackTraceElement element = stackArray[i]; 
     sb.append(element.toString() + "\n"); 
    } 

    return sb.toString(); 
} 
Các vấn đề liên quan