Thật không may, MyApp đã dừng lại. Làm sao tôi có thể giải quyết việc này?

Apr 29 2014

Tôi đang phát triển một ứng dụng và mỗi khi tôi chạy nó, tôi nhận được thông báo:

Thật không may, MyApp đã dừng lại.

Tôi có thể làm gì để giải quyết vấn đề này?


Về câu hỏi này - rõ ràng được lấy cảm hứng từ Dấu vết ngăn xếp là gì và làm cách nào để tôi có thể sử dụng nó để gỡ lỗi ứng dụng của mình? , có rất nhiều câu hỏi nói rằng ứng dụng của họ đã bị lỗi mà không có bất kỳ chi tiết nào khác. Câu hỏi này nhằm mục đích hướng dẫn các lập trình viên Android mới làm quen về cách tự thử và khắc phục sự cố của họ hoặc đặt câu hỏi phù hợp.

Trả lời

734 nhaarman Apr 29 2014 at 06:55

Câu trả lời này mô tả quá trình truy xuất dấu vết ngăn xếp. Đã có dấu vết ngăn xếp? Đọc về dấu vết ngăn xếp trong "Dấu vết ngăn xếp là gì và làm cách nào tôi có thể sử dụng nó để gỡ lỗi ứng dụng của mình? "

Vấn đề

Ứng dụng của bạn bị bỏ dở vì có một ứng dụng chưa RuntimeExceptionđược giải quyết.
Phổ biến nhất trong số này là NullPointerException.

Làm thế nào để giải quyết nó?

Mỗi khi ứng dụng Android gặp sự cố (hoặc bất kỳ ứng dụng Java nào cho vấn đề đó), a Stack tracesẽ được ghi vào bảng điều khiển (trong trường hợp này là logcat). Dấu vết ngăn xếp này chứa thông tin quan trọng để giải quyết vấn đề của bạn.

Android Studio

Trong thanh dưới cùng của cửa sổ, nhấp vào Logcatnút. Ngoài ra, bạn có thể nhấn alt+ 6. Đảm bảo rằng trình mô phỏng hoặc thiết bị của bạn được chọn trong Devicesbảng điều khiển. Tiếp theo, cố gắng tìm dấu vết ngăn xếp, được hiển thị bằng màu đỏ. Có thể có rất nhiều thứ được đăng nhập vào logcat, vì vậy bạn có thể cần cuộn một chút. Một cách dễ dàng để tìm dấu vết ngăn xếp là xóa logcat (sử dụng thùng rác ở bên phải) và để ứng dụng gặp sự cố lần nữa.

Tôi đã tìm thấy dấu vết ngăn xếp, bây giờ thì sao?

Yay! Bạn đã đi được nửa chặng đường để giải quyết vấn đề của mình.
Bạn chỉ cần tìm ra nguyên nhân chính xác khiến ứng dụng của bạn gặp sự cố, bằng cách phân tích dấu vết ngăn xếp.

Đọc về dấu vết ngăn xếp trong "Dấu vết ngăn xếp là gì và làm cách nào tôi có thể sử dụng nó để gỡ lỗi ứng dụng của mình? "

Tôi vẫn không thể giải quyết vấn đề của mình!

Nếu bạn đã tìm thấy của mình Exceptionvà dòng nơi nó xảy ra, nhưng vẫn không thể tìm ra cách khắc phục, đừng ngần ngại đặt câu hỏi trên StackOverflow.

Cố gắng ngắn gọn nhất có thể: đăng dấu vết ngăn xếp và mã liên quan (ví dụ: một vài dòng tới dòng đã ném Exception).

121 VladBezden Mar 23 2015 at 06:06

Bạn có thể sử dụng công cụ ADB của Google để có được Logcat fileđể phân tích vấn đề này.

adb logcat > logcat.txt

mở logcat.txttệp và tìm kiếm tên ứng dụng của bạn. Phải có thông tin về lý do tại sao nó không thành công, số dòng, tên lớp, v.v.

38 HirenVaghela Mar 18 2015 at 15:01

Đầu tiên, bạn kiểm tra xem ứng dụng của bạn đã bị lỗi ở điểm nào ( Unfortunately, MyApp has stopped.). Đối với điều này, bạn có thể sử dụng Log.e("TAG", "Message");, bằng cách sử dụng dòng này, bạn có thể thấy ứng dụng của mình đăng nhập logcat.

Sau đó, bạn nhận thấy điểm nào ứng dụng của mình đã dừng, điều đó rất dễ dàng để giải quyết cho bạn.

29 RahilAli Jun 11 2015 at 17:58

Chỉ cần kiểm tra lỗi trong nhật ký mèo.

Bạn nhận được tùy chọn nhật ký mèo từ trong nhật thực:

window-> show view-> others-> Android-> Logcat

Nhật ký mèo có lỗi.

Một cách khôn ngoan khác, bạn cũng có thể kiểm tra lỗi bằng cách thực thi một ứng dụng ở chế độ gỡ lỗi. Đầu tiên đặt breakpoint sau đó bằng cách:

nhấp chuột phải vào dự án-> gỡ lỗi dưới dạng-> ứng dụng Android

28 AliBdeir Nov 06 2016 at 16:23

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 danh sách các menu:

Nhấp vào "Màn hình Android" (Cái tôi đã gạch dưới 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 đã ghi. Đừng lo lắng về tất cả những lỗi này (nếu bạn mắc phải) bây giờ.

Đồng ý. Bây giờ, hãy làm những gì bạn đã làm để ứng dụng của bạn gặp sự cố. 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 sẽ tìm thấy một bản ghi sự cố mới có rất nhiều at:x.x.x: và Caused by: TrumpIsPresidentExceptionví dụ. Đi tới 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, nó là một RuntimeExceptionbên dưới nó phải có một dòng chứa liên kết màu xanh lam như:

Nếu dòng chữ đóCaused by: KHÔNG CÓ dòng chữ màu xanh lam ở đâu đó, hãy tìm dòng chữ khác có dòng chữ đó Caused by:.

Nhấp vào liên kết màu xanh lam đó . Nó sẽ đưa bạn đến nơi sự cố xảy ra. 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ị lỗi. Đó là bởi vì tôi đang tự mình loại bỏ 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 lam mà nó cung cấp 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 NullPointerException nói rằng một cái gì đó là null.

Vì vậy, chúng ta hãy tìm hiểu null là gì . Có hai khả năng. Hoặc mTextViewlà null hoặc myStringlà 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 đã đổi Verose thành Error), chúng tôi muốn thay đổi "Error" thành "Debug". Vì chúng tôi đang ghi nhật ký bằng cách gỡ lỗi. Đây là tất cả các phương pháp Nhật ký:

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, kể từ khi chúng tôi sử dụng Log.d, chúng tôi đang kiểm tra Gỡ lỗi. Đó là lý do tại sao chúng tôi đã thay đổi nó thành gỡ lỗi.

Thông báo Log.dcó 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 mình, bây giờ tôi nhận thấy điều gì đó.

Tôi đã private TextView mTextViewtuyên bố đứng đầu lớp của mình. 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 () của mình:

mTextView = (TextView) findViewById(R.id.textview_id_in_xml);

Vì vậy, ĐÓ mTextViewlà lý do tại sao trống, bởi vì tôi đã quên nói cho ứng dụng của mình biết 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 bị lỗi.


20 Ani Jul 04 2017 at 11:38

Cửa sổ bật lên này chỉ hiển thị khi bạn nhận được một ngoại lệ nghiêm trọng trong mã của mình, điều này sẽ dừng việc thực thi ứng dụng. Nó có thể là bất kỳ ngoại lệ nào NullPointerException, OutOfMemoryExceptionv.v.

Cách tốt nhất để kiểm tra là thông qua Logcat nếu bạn vẫn đang phát triển ứng dụng trong Android studio, đây là cách nhanh chóng để đọc dấu vết ngăn xếp và kiểm tra nguyên nhân của ứng dụng.

Nếu ứng dụng của bạn đã hoạt động, thì bạn không thể sử dụng logcat . Vì vậy, bạn có thể triển khai Crashlyticsđể cung cấp cho bạn các báo cáo lỗi về bất kỳ trường hợp ngoại lệ nào xảy ra.

18 Manojahirwar Jun 29 2015 at 18:48

Kiểm tra Logcattin nhắn của bạn và xem Manifesttệp của bạn . Sẽ thiếu một cái gì đó như xác định Activity,quyền Người dùng`, v.v.

15 ShivBuyya Nov 03 2015 at 12:47

Bạn có thể sử dụng bất kỳ công cụ nào sau đây:

  1. adb logcat

  2. adb logcat> logs.txt (bạn có thể sử dụng trình chỉnh sửa để mở và tìm kiếm lỗi.)

  3. eclipse logcat (Nếu không hiển thị trong eclipse, hãy đi tới Windows-> Hiển thị Chế độ xem-> Khác-> Android-> LogCat)

  4. Android Debug Monitor hoặc Android Device Monitor (nhập lệnh theo dõi hoặc mở qua giao diện người dùng)

  1. Android Studio

Tôi đề nghị sử dụng Android Debug Monitor , nó là tốt. Bởi vì nhật thực bị treo khi có quá nhiều nhật ký ở đó, và thông qua bộ lọc adb logcat và tất cả đều khó khăn.

13 alirezaamini Jul 13 2015 at 15:37

Bạn phải kiểm tra Stack trace

Làm thế nào để làm điều đó?

trên IDE của bạn Kiểm tra biểu mẫu cửa sổ LOGCAT

Nếu bạn không thấy cửa sổ logcat, hãy truy cập đường dẫn này và mở nó

window->show view->others->Android->Logcat

nếu bạn đang sử dụng Google-Api, hãy đi đến đường dẫn này

adb logcat> logcat.txt

12 MayankNema Apr 03 2017 at 16:37

Trong phương thức showToast () bên dưới, bạn phải truyền một tham số khác cho ngữ cảnh hoặc ngữ cảnh ứng dụng bằng cách làm như vậy bạn có thể thử.

  public void showToast(String error, Context applicationContext){
        LayoutInflater inflater = getLayoutInflater();
        View view = inflater.inflate(R.layout.custom_toast, (ViewGroup)      
        findViewById(R.id.toast_root));
        TextView text = (TextView) findViewById(R.id.toast_error);
        text.setText(error);
        Toast toast = new Toast(applicationContext);
        toast.setGravity(Gravity.TOP | Gravity.FILL_HORIZONTAL, 0, 0);
        toast.setDuration(Toast.LENGTH_SHORT);
        toast.setView(view);
        toast.show();
}
11 W0rmH0le Jul 14 2016 at 10:21

Hãy để tôi chia sẻ phân tích Logcat cơ bản về thời điểm bạn gặp Force Close (khi ứng dụng ngừng hoạt động).

DOCS

Công cụ cơ bản của Android để thu thập / phân tích nhật ký là logcat.

ĐÂY là trang của Android về logcat

Nếu bạn sử dụng android Studio, bạn cũng có thể kiểm tra LINK này .

Chụp

Về cơ bản, bạn có thể chụp logcat một cách thủ công bằng lệnh sau (hoặc chỉ cần kiểm tra cửa sổ AndroidMonitor trong AndroidStudio):

adb logcat

Có rất nhiều tham số bạn có thể thêm vào lệnh giúp bạn lọc và hiển thị thông báo mà bạn muốn ... Đây là thông tin cá nhân ... Tôi luôn sử dụng lệnh dưới đây để lấy dấu thời gian của thông báo:

adb logcat -v time

Bạn có thể chuyển hướng đầu ra thành tệp và phân tích tệp đó trong Trình soạn thảo văn bản.

Phân tích

Nếu ứng dụng của bạn đang gặp sự cố, bạn sẽ nhận được một cái gì đó như:

07-09 08:29:13.474 21144-21144/com.example.khan.abc D/AndroidRuntime: Shutting down VM
07-09 08:29:13.475 21144-21144/com.example.khan.abc E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.khan.abc, PID: 21144
    java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v4.app.FragmentActivity.onBackPressed()' on a null object reference
     at com.example.khan.abc.AudioFragment$1.onClick(AudioFragment.java:125)
     at android.view.View.performClick(View.java:4848)
     at android.view.View$PerformClick.run(View.java:20262)
     at android.os.Handler.handleCallback(Handler.java:815)
     at android.os.Handler.dispatchMessage(Handler.java:104)
     at android.os.Looper.loop(Looper.java:194)
     at android.app.ActivityThread.main(ActivityThread.java:5631)
     at java.lang.reflect.Method.invoke(Native Method)
     at java.lang.reflect.Method.invoke(Method.java:372)
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:959)
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754)
07-09 08:29:15.195 21144-21144/com.example.khan.abc I/Process: Sending signal. PID: 21144 SIG: 9

Phần này của nhật ký hiển thị cho bạn rất nhiều thông tin:

  • Khi sự cố xảy ra: 07-09 08:29:13.475

Điều quan trọng là phải kiểm tra thời điểm sự cố xảy ra ... Bạn có thể tìm thấy một số lỗi trong nhật ký ... bạn phải chắc chắn rằng bạn đang kiểm tra các thông báo thích hợp :)

  • Ứng dụng nào bị lỗi: com.example.khan.abc

Bằng cách này, bạn biết ứng dụng nào bị lỗi (để đảm bảo rằng bạn đang kiểm tra nhật ký về tin nhắn của mình)

  • LỖI nào: java.lang.NullPointerException

Lỗi ngoại lệ con trỏ NULL

  • Thông tin chi tiết về lỗi: Attempt to invoke virtual method 'void android.support.v4.app.FragmentActivity.onBackPressed()' on a null object reference

Bạn đã cố gắng gọi phương thức onBackPressed()từ một FragmentActivityđối tượng. Tuy nhiên, đối tượng đó là nullkhi bạn làm điều đó.

  • Stack Trace: Stack Trace hiển thị cho bạn thứ tự gọi phương thức ... Đôi khi, lỗi xảy ra trong phương thức gọi (và không phải trong phương thức được gọi).

    tại com.example.khan.abc.AudioFragment $ 1.onClick (AudioFragment.java:125)

Đã xảy ra lỗi trong tệp com.example.khan.abc.AudioFragment.java, onClick()phương thức bên trong tại dòng: 125(stacktrace hiển thị dòng đã xảy ra lỗi)

Nó được gọi bằng:

at android.view.View.performClick(View.java:4848)

Được gọi bằng:

at android.view.View$PerformClick.run(View.java:20262)

được gọi bằng:

at android.os.Handler.handleCallback(Handler.java:815)

Vân vân....

Tổng quat

Đây chỉ là một cái nhìn tổng quan ... Không phải tất cả nhật ký đều đơn giản nhưng lỗi đưa ra vấn đề cụ thể và chi tiết hiển thị tất cả vấn đề ... Nó chỉ là để chia sẻ ý tưởng và cung cấp thông tin cấp đầu vào cho bạn ...

Tôi hy vọng tôi có thể giúp bạn một lúc nào đó ... Trân trọng

9 BiswajitKarmakar May 15 2016 at 14:45

Sử dụng LogCat và cố gắng tìm nguyên nhân khiến ứng dụng gặp sự cố.

Để xem Logcat nếu bạn sử dụng Android Studio, hãy nhấn ALT + 6 hoặc

nếu bạn sử dụng Eclipse thì Window -> Open Perspective -> Other - LogCat

Đi tới LogCat, từ trình đơn thả xuống chọn lỗi. Điều này sẽ chứa tất cả thông tin cần thiết để giúp bạn gỡ lỗi. Nếu điều đó không hữu ích, hãy đăng LogCat dưới dạng chỉnh sửa cho câu hỏi của bạn và ai đó sẽ giúp bạn.

8 felislynx.silae Oct 02 2017 at 22:07

Nếu ứng dụng của bạn bị treo vì lý do nào đó mà không có hệ thống ngăn xếp tốt. Hãy thử gỡ lỗi nó từ dòng đầu tiên và đi từng dòng cho đến khi gặp sự cố. Sau đó, bạn sẽ có câu trả lời, dòng nào đang gây rắc rối cho bạn. Có thể bạn có thể quấn nó vào thử khối bắt và đầu ra lỗi in.

6 Pelpotronic Mar 22 2015 at 15:50

Bạn cũng có thể tự nhận được thông báo lỗi này mà không có bất kỳ dấu vết ngăn xếp nào hoặc bất kỳ thông báo lỗi nào khác.

Trong trường hợp này, bạn cần đảm bảo rằng tệp kê khai Android của mình được định cấu hình chính xác (bao gồm mọi hoạt động hợp nhất tệp kê khai xảy ra từ thư viện và bất kỳ hoạt động nào đến từ thư viện) và đặc biệt chú ý đến hoạt động đầu tiên được hiển thị trong ứng dụng của bạn trong tệp kê khai .

6 naXa Sep 11 2018 at 15:35

Sự cố trong quá trình phát triển

Hãy thử logview công cụ yêu thích của tôi để lấy nhật ký và phân tích chúng trong quá trình phát triển.
Đảm bảo đánh dấu ./logview./lib/logview.jarlà tệp thực thi khi chạy trong Linux.

Nếu bạn không thích nó, có rất nhiều trình xem nhật ký trên máy tính để bàn thay thế cho Android .

Tai nạn trong tự nhiên

Tích hợp công cụ báo cáo sự cố theo thời gian thực, chẳng hạn như Firebase Crashlytics để nhận được dấu vết của các trường hợp ngoại lệ không được khắc phục đã xảy ra trên thiết bị của người dùng.

Đọc Cách phát hành một ứng dụng lỗi (Và Trực tiếp để kể câu chuyện) để biết thêm về cách xử lý lỗi trong lĩnh vực này.

5 KopiBryant May 20 2018 at 00:24

Mọi người mắc lỗi và lập trình cũng vậy.

Khi có bất kỳ sự cố nào errorxảy ra, hãy luôn kiểm tra logcat với dòng chữ màu đỏ, tuy nhiên bạn có thể tìm ra vấn đề thực sự trong văn bản màu xanh lam với gạch chân trong dòng chữ màu đỏ đó.

Đảm bảo nếu bạn tạo mới activity, hãy luôn khai báo activitytrong AndroidManifesttệp.

Nếu thêm Quyền, hãy khai báo nó trong AndroidMainifesttệp.

5 Ashish Mar 26 2019 at 11:42

Logcat - Để kiểm tra nhật ký trong giai đoạn phát triển của Android Studio

Ban đầu hãy xóa Logcat và để ứng dụng gặp sự cố lần nữa để bạn chỉ có thể nhận được chi tiết nhật ký bị lỗi. Bạn phải kiểm tra dấu vết ngăn xếp

Trong khi, thật không may, MyApp đã dừng lại. Có rất nhiều lý do cho nó. Bạn có thể kiểm tra nhật ký tương tự. Đối với điều này, bạn có thể sử dụng Log.e ("TAG", "Tin nhắn");

Lỗi thường gặp trong sự cố ứng dụng như:

  1. Lỗi mã hóa (Sử dụng sai từ khóa).
  2. Tên thuộc tính không khớp.
  3. Plugin không được hỗ trợ (có thể).
  4. Phiên bản không khớp (có thể).
  5. Hoạt động bị thiếu trong tệp AndroidManifest.
  6. Thiếu quyền trong tệp AndroidManifest.
  7. NullPointerException phổ biến nhất.
  8. Đã khai báo nhưng không được xác định.

Để giải quyết lỗi crash ứng dụng:

  • Hãy ghi nhớ những điểm trên và đi qua nó.
  • Với lỗi, bạn sẽ nhận được tên tệp cũng có màu xanh lam (nhấp vào chúng và chuyển đến mã do lỗi đang xảy ra).
4 MehulSolanki May 22 2019 at 17:40

Trước tiên, bạn cần kiểm tra vị trí và lý do tại sao ứng dụng của bạn bị lỗi. (Unfortunately, MyApp has stopped.).Với sự trợ giúp của LOG, bạn có thể tìm ra lỗi.

Sau đó, bạn tìm thấy điểm nào mà ứng dụng của bạn đã dừng, hãy sửa lỗi đó từ điểm của bạn.

4 zapotec Jun 12 2019 at 20:07

Nếu bạn không có bất kỳ loại nhật ký thú vị nào trong thiết bị đầu cuối của mình (hoặc chúng không liên quan trực tiếp đến ứng dụng của bạn), có thể vấn đề của bạn là do thư viện gốc. Trong trường hợp đó, bạn nên kiểm tra các tệp "bia mộ" trong thiết bị đầu cuối của mình.

Vị trí mặc định cho các tệp bia mộ tùy thuộc vào mọi thiết bị, nhưng nếu đúng như vậy, bạn sẽ có một nhật ký cho biết: Tombstone written to: /data/tombstones/tombstone_06

Để biết thêm thông tin, hãy xem tại https://source.android.com/devices/tech/debug .

2 MohsenEmami Mar 16 2020 at 17:18

Ngoài ra, chạy lệnh này trong terminal có thể giúp tìm ra sự cố:

gradlew build > log.txt 2>details.txt

thì bạn nên đi đến vị trí tệp gradlew trong đọc hai tệp nhật ký ở trên.