Lưu ý: Câu trả lời này đang sử dụng Android Studio 2.2.2
Lưu ý 2: Tôi đang xem xét rằng thiết bị của bạn được kết nối thành công.
Điều đầu tiên bạn làm khi ứng dụng của bạn gặp sự cố là nhìn vào LogCat, ở cuối Android Studio có một thanh công cụ với một danh sách các menu:
Nhấp vào "Màn hình Android" (Cái tôi đã gạch chân trong hình trên. ^)
Bây giờ, bạn sẽ nhận được một cái gì đó như thế này:
Thay đổi " Verbose
" thành " Error
" Bây giờ nó sẽ chỉ hiển thị cho bạn các lỗi đã đăng nhập. Đừng lo lắng về tất cả các lỗi này (nếu bạn mắc phải) ngay bây giờ.
Đồng ý. Bây giờ, làm những gì bạn đã làm để sụp đổ ứng dụng của bạn. Sau khi ứng dụng của bạn gặp sự cố, hãy truy cập logcat của bạn. Bạn nên tìm một bản ghi sự cố mới có rất nhiều at:x.x.x
: và Caused by: TrumpIsPresidentException
ví dụ. Đi đến Caused by:
tuyên bố đó trong logcat của bạn.
Bên cạnh đó Caused By:
, nên có Ngoại lệ đã xảy ra. Trong trường hợp của tôi, đó là một RuntimeException
và bên dưới nó nên có một dòng chứa một liên kết màu xanh như:
Nếu điều đóCaused by:
KHÔNG có một dòng với một văn bản màu xanh ở đâu đó bên dưới nó, thì hãy tìm một dòng khác Caused by:
.
Nhấp vào liên kết màu xanh đó . Nó sẽ đưa bạn đến nơi xảy ra vấn đề. Trong trường hợp của tôi, đó là do dòng này:
throw new RuntimeException();
Vì vậy, bây giờ tôi biết tại sao nó bị rơi. Đó là vì tôi đang tự ném ngoại lệ. Đây là một lỗi rõ ràng .
Tuy nhiên, giả sử tôi gặp một lỗi khác:
java.lang.NullPointerException
Tôi đã kiểm tra logcat của mình, tôi nhấp vào liên kết màu xanh mà nó đưa cho tôi và nó đưa tôi đến đây:
mTextView.setText(myString);
Vì vậy, bây giờ tôi muốn gỡ lỗi. Theo câu hỏi StackOverflow này , một NullPulumException nói rằng có gì đó null
.
Vì vậy, hãy tìm hiểu những gì là null . Có hai khả năng. Hoặc mTextView
là null, hoặc myString
là null. Để tìm hiểu, trước mTextView.setText(mString)
dòng, tôi thêm hai dòng sau:
Log.d("AppDebug","mTextView is null: " + String.valueOf(mTextView == null);
Log.d("AppDebug","myString is null: " + String.valueOf(myString== null);
Bây giờ, giống như chúng tôi đã làm trước đây (Chúng tôi đã thay đổi Verose thành Lỗi), chúng tôi muốn thay đổi "Lỗi" thành "Gỡ lỗi". Vì chúng tôi đang đăng nhập bằng cách gỡ lỗi. Đây là tất cả các phương thức Log:
Log.
d means Debug
e means error
w means warning
v means verbose
i means information
wtf means "What a terrible failure". This is similar to Log.e
Vì vậy, vì chúng tôi đã sử dụng Log.d
, chúng tôi đang kiểm tra trong Debug. Đó là lý do tại sao chúng tôi thay đổi nó để gỡ lỗi.
Thông báo Log.d
có một tham số đầu tiên, trong trường hợp của chúng tôi là "AppDebug". Nhấp vào menu thả xuống "Không có bộ lọc" ở phía trên bên phải của logcat. Chọn "Chỉnh sửa cấu hình bộ lọc", đặt tên cho bộ lọc của bạn và trong "Thẻ nhật ký" đặt "Gỡ lỗi ứng dụng". Nhấp vào "OK". Bây giờ, bạn sẽ thấy hai dòng trong logcat:
yourPackageNameAndApp: mTextView is null: true
yourPackageNameAndApp: myString is null: false
Vì vậy, bây giờ chúng ta biết rằng mTextView là null.
Tôi quan sát mã của tôi, bây giờ tôi nhận thấy một cái gì đó.
Tôi đã private TextView mTextView
tuyên bố ở đầu lớp của tôi. Nhưng, tôi không định nghĩa nó.
Về cơ bản, tôi đã quên làm điều này trong onCreate ():
mTextView = (TextView) findViewById(R.id.textview_id_in_xml);
Vì vậy, đó mTextView
là lý do tại sao là không, bởi vì tôi quên nói với ứng dụng của mình nó là gì. Vì vậy, tôi thêm dòng đó, chạy ứng dụng của mình và bây giờ ứng dụng không gặp sự cố.