2011-09-29 39 views
35

Tôi đang sử dụng Eclipse để gỡ lỗi một ứng dụng Java. Một nơi nào đó trong mã tôi nhận được một ngoại lệ và stack trace:Làm thế nào để hiển thị dấu vết ngăn xếp đầy đủ trên nhật thực?

Caused by: java.io.EOFException: The connection has been reset while reading the header 
    at com.gemstone.gemfire.internal.cache.tier.sockets.Message.fetchHeader(Message.java:583) 
    at com.gemstone.gemfire.internal.cache.tier.sockets.Message.readHeaderAndPayload(Message.java:599) 
    at com.gemstone.gemfire.internal.cache.tier.sockets.Message.read(Message.java:542) 
    at com.gemstone.gemfire.internal.cache.tier.sockets.Message.recv(Message.java:1029) 
    at com.gemstone.gemfire.cache.client.internal.AbstractOp.attemptReadResponse(AbstractOp.java:158) 
    at com.gemstone.gemfire.cache.client.internal.AbstractOp.attempt(AbstractOp.java:363) 
    at com.gemstone.gemfire.cache.client.internal.ConnectionImpl.execute(ConnectionImpl.java:229) 
    at com.gemstone.gemfire.cache.client.internal.pooling.PooledConnection.execute(PooledConnection.java:321) 
    at com.gemstone.gemfire.cache.client.internal.OpExecutorImpl.executeWithPossibleReAuthentication(OpExecutorImpl.java:646) 
    at com.gemstone.gemfire.cache.client.internal.OpExecutorImpl.execute(OpExecutorImpl.java:108) 
    ... 11 more 

Làm thế nào để tôi nhận được toàn bộ stack thay vì ... 11 more?

+2

Cửa sổ bảng điều khiển Eclipse sẽ hiển thị toàn bộ ngoại lệ. Dấu vết in này ở đâu? Tôi đã thấy các dấu vết bị giới hạn như thế này trong trình duyệt khi xử lý một ứng dụng web, nhưng không bao giờ có dấu vết giới hạn trong bảng điều khiển. – cdeszaq

+0

Tôi không biết, đó là những gì tôi đang cố gắng tìm hiểu. Vấn đề là điểm dừng của tôi không được kích hoạt, vì vậy tôi không thể tìm ra chính xác nơi nào. –

+0

Ý của bạn là gì? Tất cả những gì tôi hỏi là "bạn đang thấy cái này ở đâu"? Nó nằm trong một phần của giao diện IDE Eclipse (đặc biệt là giao diện điều khiển), hay nó hiển thị trong một số cửa sổ hoặc tệp khác? – cdeszaq

Trả lời

28

Bạn toàn bộ ngăn xếp.

Đây chỉ là một phần của dấu vết ngăn xếp. Ngay trước đó là một phần khác. Nhìn vào các dòng dưới cùng của dòng này, và các dòng trên cùng của dòng trước. Bạn sẽ thấy chúng khớp với nhau. Theo dõi ngăn xếp bắt đầu bằng một phần không bắt đầu bằng "Gây ra bởi".

Ngoại lệ "Gây ra bởi" là ẩn các phần của dấu vết ngăn xếp là các bản sao nguyên gốc của các mục theo dõi ngăn xếp trong phụ huynh của nó. Nói cách khác, Java không hiển thị toàn bộ stack lên tới main() cho mọi nguyên nhân - nó chỉ hiển thị những gì bạn chưa thấy. Xem Throwable.printStackTrace() documentation.

"Gây ra bởi" được điền khi bạn cung cấp nguyên nhân khi tạo Throwable. Nhìn vào các nhà thầu cho nó. Điều này được thực hiện khi một đoạn mã bắt được một ngoại lệ cấp thấp và sau đó muốn xem lại nó như là một lớp ngoại lệ khác.

+4

Tôi không hoàn toàn hiểu ... –

+3

@Luchian - Đây chỉ là _part_ của một dấu vết ngăn xếp. Ngay trước đó là một phần khác. Nhìn vào các dòng dưới cùng của dòng này, và các dòng trên cùng của dòng trước. Bạn sẽ thấy chúng khớp với nhau. Dấu vết ngăn xếp _began_ với một phần không bắt đầu bằng "Gây ra bởi". –

+1

Phải ... ok, vì vậy tôi đoán là tôi bị kẹt. Tôi muốn bắt ngoại lệ trước đó. Thing là, tôi thiết lập một breakpoint đến nơi mà các ngoại lệ là dường như ném nhưng nó không được kích hoạt ... –

1

Như Ed nói, nó hiển thị toàn bộ ngăn xếp, nhưng để lại thông tin mà bạn đã thấy. Xem Throwable#printStackTrace()

Trích dẫn từ đó:

Lưu ý sự hiện diện của các dòng có chứa các ký tự "...". Các dòng này cho biết phần còn lại của dấu vết ngăn xếp cho trường hợp ngoại lệ này khớp với số khung được chỉ định từ dưới cùng của theo dõi ngăn xếp của ngoại lệ do ngoại lệ này (ngoại lệ "kèm theo"). viết tắt này có thể làm giảm đáng kể độ dài của đầu ra trong trường hợp thông thường, nơi một ngoại lệ bọc là ném từ cùng một phương pháp như là "ngoại lệ gây bệnh" được bắt

Thông thường một ngoại lệ được gói; được tạo với một ngoại lệ khác là nguyên nhân:

try { 
    // something which causes an Exception 
} catch (Exception e) { 
    throw new SpecificException("help", e); 
} 

Trong trường hợp này, hiển thị ngăn xếp sẽ tạo ... 11 xem thêm bạn thấy.

1

Tôi chưa bao giờ thấy, nhưng cố gắng này

public void problemFunction(){ 
    try{ 
     //your code 
    catch(Exception ex){ 
    ex.printStackTrace(); 
    } 
} 

hoặc

public void problemFunction(){ 
    try{ 
     //your code 
    } 
    catch(Exception ex){ 
    System.out.println(ex); 
    StackTraceElement[] arr = ex.getStackTrace(); 
    for(int i=0; i<arr.length; i++){ 
     System.out.println(arr[i].toString()); 
    } 
    } 
} 
2

tôi nghĩ rằng nó có nghĩa là Exception đã bị bắt và được đóng gói vào một lần trước printStackTrace được gọi.

Hãy thử và tìm ra các đầu ra của chương trình sau đây để hiểu rõ hơn:

public class PrintStackTrace { 

    public static void main(String[] args) { 
     try { 
      level1(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     try { 
      level2(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 


    static void level2() throws Exception { 
     try { 
      level1(); 
     } catch (Exception e) { 
      throw new Exception(e); 
     } 
    } 

    static void level1() throws Exception { 
     try { 
      throwingMethod(); 
     } catch (Exception e) { 
      throw new Exception(e); 
     } 
    } 

    static void throwingMethod() throws Exception { 
     throw new Exception("throwingMethod"); 
    } 

} 
9

câu trả lời ở trên là không chính xác, mỗi khi chồng hiển thị dòng chữ "do" có nghĩa là ngoại lệ đi qua một hoặc nhiều phương pháp cho đến khi nó bị bắt, và sau đó ném lại. Điều này có thể xảy ra nhiều lần nhiều lần, dấu vết ngăn xếp không phải là một vòng lặp, nó là một hướng duy nhất, vì vậy không, các thứ ở trên không liên quan đến thứ ở phía dưới, phần quan trọng nhất ở phía dưới, là gốc rễ của sự ngoại lệ, vì vậy nếu bạn sẽ có:

ngoại lệ trong lớp học chính: blah blah blah ... dòng mã ... do FileNotFoundException ... dòng mã ... gây ra bởi: MalformedURLException ... các dòng mã ... do: NullPointerException

thì bạn sẽ không muốn tập trung quá nhiều vào FileNotFoundException, nhưng bạn sẽ muốn tập trung thêm về NullPointerException. Giống như nói rằng bạn đã có một tập tin thuộc tính với một tên tập tin trong đó. Nếu vô tình sử dụng mykey, để tìm thuộc tính "myKey", thì thuộc tínhResource sẽ trả về một giá trị rỗng, sau đó sẽ được ném tất cả các dòng mã (hy vọng) vào ứng dụng của bạn nơi khối catch cuối cùng là. . . mà, tại piont này, nó sẽ được "bọc" không phải là một nullException, nhưng như là một FileNotFoundException. . .

5

enter image description here

Chúng tôi có thể phân biệt với vấn đề thực tế mà anh gặp phải. Tôi đã có vấn đề tương tự và nó quay ra tôi đã kiểm tra giới hạn của tôi ra hộp kiểm tra đánh dấu. Sau khi tôi xóa nó, tôi đã có thể nhìn thấy dấu vết ngăn xếp đầy đủ. Các bước: Nhấp chuột phải vào bảng điều khiển || Ctrl + click nếu mac đi đến sở thích và làm theo hướng dẫn ở trên

+0

Không thể biết chúng ta đang phân kỳ bao nhiêu, đã 4 năm :) Không còn phải đối mặt với vấn đề đó nữa ... –

+0

Haha. Tôi đã thực sự phải đối mặt với vấn đề này.Vì vậy, đặt nó ra có để người khác không bị phân tâm khi anh ta không nhìn thấy dấu vết chồng đầy đủ trong nhật thực. Bốn năm trong một thời gian dài. – shashwatZing

0

Có một tùy chọn vmargs

-XX:-OmitStackTraceInFastThrow 

mà có thể giúp đỡ trong một số tình huống.

Các vấn đề liên quan