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.
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. –
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
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á ... –