2011-02-03 31 views
15

Phải thừa nhận rằng, câu hỏi của tôi về cơ bản là tương tự như thế này, nhưng nó dường như đã bị bỏ lại chưa được trả lời:Trình gỡ lỗi Android của Eclipse - Tôi đã gây ra ngoại lệ ở đâu trong mã của mình?

NullPointerException in handleStopActivity -- No reference to my code in stack trace

Downloaded Eclipse Helios, Android Developer Tools Plugin, và JDK tất cả trong tuần trước. Tôi đã rối tung xung quanh với một ứng dụng trên thiết bị của tôi, chạy nó trong chế độ Debug, và nó bất ngờ chấm dứt. Tôi nhận ra tôi đã gây ra một NullPointerException và vấn đề chính nó không phải là một vấn đề cho rất dài.

Vấn đề là gì, tuy nhiên, trình gỡ rối dường như không thể xác định vị trí trong mã của tôi ngoại lệ được ném. Theo dõi ngăn xếp không tham chiếu đến mã của tôi.

Thật vậy, nếu tôi đặt sau trong phương pháp OnCreate(), tôi nhận được cùng một vấn đề

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    //lI("onCreate()"); //A silly logging thing I messed around with 

    Integer iDareYou = null; 
    iDareYou.byteValue(); 

Phần lớn tín dụng của nó, Eclipse chắc chắn cảnh báo tôi rằng mã có khả năng để thổi lên vào mặt tôi. Nhưng khi tôi thực sự chạy này trên thiết bị của tôi, stack trace trở lại như sau:

Thread [<1> main] (Suspended (exception RuntimeException)) 
ActivityThread.performLaunchActivity(ActivityThread$ActivityRecord, Intent) line: 2787 
ActivityThread.handleLaunchActivity(ActivityThread$ActivityRecord, Intent) line: 2803 
ActivityThread.access$2300(ActivityThread, ActivityThread$ActivityRecord, Intent) line: 135 
ActivityThread$H.handleMessage(Message) line: 2136 
ActivityThread$H(Handler).dispatchMessage(Message) line: 99 
Looper.loop() line: 144 
ActivityThread.main(String[]) line: 4937  
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method] 
Method.invoke(Object, Object...) line: 521 
ZygoteInit$MethodAndArgsCaller.run() line: 868 
ZygoteInit.main(String[]) line: 626 
NativeStart.main(String[]) line: not available [native method] 

Tôi đã tìm kiếm xung quanh cho một số câu trả lời và không may tất cả tôi có thể đưa ra những câu hỏi của 'Tại sao ứng dụng Android của tôi gây ra một NullPointerException '? đa dạng.

Tôi hy vọng sẽ tìm hiểu những gì tôi nên làm khác đi để có thể tìm ra điểm trong mã của tôi, nơi tôi gây ra ngoại lệ .... bởi vì tôi chắc chắn rằng khả năng này sẽ có ích tại một số điểm trong tương lai!


Sẽ chỉnh sửa thông tin này để thêm một số thông tin. Như bình luận đầu tiên bên dưới đề cập đến, trạng thái trong đó trình gỡ rối đình chỉ chuỗi không phải là trạng thái 'cuối cùng' của ứng dụng. Nhấn 'tiếp tục' một vài lần di chuyển quá trình đến điểm mà quá trình thực sự chấm dứt, mặc dù tiếc là không có dấu vết ngăn xếp hữu ích nào được hiển thị trong cửa sổ gỡ lỗi Eclipse/ADT. Tuy nhiên, tại thời điểm này theo dõi ngăn xếp tôi dán trên Theo sau bởi 3 dòng đầu tiên duy nhất của dấu vết ngăn xếp của NPE trong mã của tôi là đầu ra cho LogCat. Trước đây tôi đã xem xét liệu LogCat có bất kỳ thứ gì tôi có thể sử dụng hay không, nhưng rất có thể trước khi tôi nhấn 'resume' trong trình gỡ rối để chuyển quá trình này sang trạng thái này. Thật không may mặc dù, làm theo cách này không bao giờ hiển thị một dấu vết ngăn xếp của NPE trong mã của tôi trong trình gỡ lỗi thực tế.

Nhưng tin tức không phải là tất cả xấu - từ thông tin trong cửa sổ 'Biến' ở bên phải, tôi có thể thấy rằng có một NPE trong phạm vi hiện tại của chuỗi, do đó ít nhất sẽ cho tôi manh mối rằng một NPE đang diễn ra (và dĩ nhiên có LogCat).

Vì vậy, dựa trên một đề xuất trong một chủ đề khác nhau, công việc tốt nhất xung quanh tôi đã tìm thấy là thêm một break "Caught và Uncaught" cho NullPointerException. Khi tôi làm điều này và khởi chạy lại, trình gỡ lỗi hiển thị dấu vết ngăn xếp của NPE trong mã của tôi và di chuyển cửa sổ chỉnh sửa thẳng đến dòng mà tôi đã gây ra NPE.

Hiện tại tôi tin rằng điều này là do NPE đang bị bắt giữ (và có lẽ, được ném lại) bởi khung công tác Android. Có vẻ như tình trạng tiến thoái lưỡng nan ban đầu là do cửa sổ Dấu vết ngăn xếp của Eclipse/ADT/DalvikVM gỡ lỗi không bao gồm thông tin 'gây ra bởi' (theo như tôi có thể biết) được hiển thị trong dấu vết ngăn xếp "sau" xuất hiện trong LogCat.Tôi sẽ điều tra thêm về việc liệu điều này có thể được khắc phục hay không :)

Tôi đánh giá cao đề xuất của Bert F, vì tôi không nhận thức rõ rằng luồng vẫn chưa ở trạng thái 'cuối cùng'. Mặc dù dấu vết ngăn xếp là [sau] được hiển thị trong LogCat, tôi không 'bỏ lỡ' nó trong LogCat bởi vì nó không phải ở đó, những gì tôi đã bỏ lỡ đã nhấn 'resume' mà có thể đã gây ra stack trace là đầu ra trong LogCat.

Mặc dù ban đầu tôi có trình gỡ rối dừng ở dòng trong mã của tôi bằng cách sử dụng điểm ngắt, có một trường hợp thực tế là cuối cùng tôi có thể có được dấu vết ngăn xếp trong LogCat sau khi tiếp tục chuỗi, Đã giải quyết vấn đề. Điều duy nhất tôi thực sự có thể yêu cầu sẽ là có trình gỡ lỗi dừng lại ở dòng trong mã của tôi gây ra ngoại lệ, thay vì nó bị bắt và sau đó được ném lại bởi khung công tác Android. Nhưng tôi tin rằng đó sẽ là một câu hỏi khác :) Và Eclipse, hữu ích vì nó, sẽ gửi cho tôi ở đó nếu tôi nhấp vào dòng thích hợp trong dấu vết ngăn xếp được hiển thị trong cửa sổ LogCat.

+2

Dường như chương trình bị tạm ngưng trong trình gỡ lỗi và không tiếp tục in ngoại lệ và theo dõi ngăn xếp đầy đủ. Để chương trình tiếp tục và sau đó hiển thị thông báo ngoại lệ đầy đủ và toàn bộ stacktrace sẽ hữu ích. Thường thì một NPE được bao bọc bởi nhiều ngoại lệ (in "do" trong dấu vết ngăn xếp) - thông báo "gây ra bởi" thấp nhất có lẽ là quan trọng nhất.Ngoài ra, nếu bạn biết vòng quay của mình, nó có thể giúp tìm nguồn phù hợp với dấu vết ngăn xếp. –

+0

Bert, nếu bạn muốn đăng lại như một câu trả lời tôi sẵn sàng chấp nhận nó, người ta có thể nói 'tiếp tục đẩy sẽ nhận được dấu vết ngăn xếp tôi hỏi' – user602347

+0

Bạn không phải là người duy nhất không thể hiểu được điều này! Bạn đang khá đúng mặc dù - nhấn chơi một vài lần để cho các trường hợp ngoại lệ bong bóng lên, và sau đó nhìn vào LogCat thay vì theo dõi ngăn xếp. Tôi đã sử dụng nhiều, nhiều IDE và có vẻ kỳ quái với tôi rằng "dòng mã của tôi đã sai" sẽ xuất hiện là thứ mà chỉ các chuyên gia mới có thể khám phá ... –

Trả lời

2

Tôi chạy mã chính xác của bạn và LogCat đã cho tôi những ngoại lệ sau:

Caused by: java.lang.NullPointerException 
    at mypackage.test.TestActivity.onCreate(TestActivity.java:23) 

Tất nhiên đó là tuyên bố

iDareYou.byteValue();

. Điều này rõ ràng là một ngày tươi sáng!

Tôi khuyên bạn nên tìm hiểu cách sử dụng Dalvik Debug Monitor Server theo cách phù hợp.

Nhật ký bạn đăng có vẻ khá vô dụng, bạn đã làm sai lệch một số bộ lọc LogCat (nó đã xảy ra với tôi một lần) chưa?

OFFTOPIC: "Tôi đã gây ra ngoại lệ ở đâu trong mã của mình?" - Tôi nghĩ rằng câu hỏi của bạn không được xây dựng tốt.

Tôi nghĩ rằng tên riêng của câu hỏi này có thể là - 'Cách sử dụng trình gỡ lỗi Android và LogCat? Một số ngoại lệ không được ghi lại đúng cách! '

+1

Cảm ơn ý kiến ​​của bạn. Tôi tin rằng tên câu hỏi là thích hợp vì tôi không xem dấu vết ngăn xếp với LogCat, tôi đã sử dụng cửa sổ Gỡ lỗi trong Eclipse/ADT mà tôi đã nêu trong tên câu hỏi. Bạn đang gợi ý rằng tôi có thể giải quyết vấn đề ban đầu với LogCat, điều này chắc chắn đúng, tuy nhiên câu hỏi của tôi là tại sao cửa sổ Eclipse/ADT xuất hiện để không hiển thị bất kỳ dấu vết stack hữu ích nào. – user602347

+1

Ngoài ra dấu vết ngăn xếp không được hiển thị trong LogCat tại thời điểm trình gỡ rối đình chỉ chuỗi, vì vậy câu trả lời không đơn giản như việc tôi không giải thích đúng những gì được hiển thị trong LogCat. – user602347

1

Trong Eclipse SDK Android cung cấp một số chế độ xem. Trên nó được gọi là "LogCat". Ở đó, bạn có thể tìm thấy dấu vết ngăn xếp ngoại lệ

0

Theo kinh nghiệm của tôi, Android ăn lên các ngoại lệ xảy ra khi lạm phát một cách bố trí. Nó chắc chắn nên báo cáo trường hợp ngoại lệ, nhưng dường như một số nhà phát triển Android buồn bã quyết định bắt nó và tạo một cái mới - mà không cần thêm cái cũ là cause. Tôi xem nó như là một thiếu của môi trường Android; vì có thể khó tiếp cận với nhóm Android mà tôi đã sống với nó cho đến bây giờ, nhưng tôi sẽ báo cáo với Google nếu điều đó thực sự làm phiền tôi.

+0

Tôi nghĩ rằng điều này là đúng, nhưng nó không làm điều đó trong trường hợp này. –

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