不幸的是,MyApp已经停止。 我该如何解决这个问题?

我正在开发一个应用程序,每当我运行它,我得到的消息:

不幸的是,MyApp已经停止。

我能做些什么来解决这个问题?


关于这个问题 – 明显的启发是什么是一个堆栈跟踪,我怎样才能用它来debugging我的应用程序错误? ,有很多问题说明他们的应用程序已经崩溃,没有进一步的细节。 这个问题的目的是指导新手Android程序员如何尝试自己修复问题,或者提出正确的问题。

这个答案描述了检索堆栈跟踪的过程。 已经有堆栈跟踪? 请阅读“ 什么是堆栈跟踪,以及如何使用它来debugging我的应用程序错误 ”中的堆栈跟踪?

问题

您的应用程序因为抛出未捕获的RuntimeException而退出。
其中最常见的是NullPointerException

如何解决?

每次Android应用程序崩溃时(或者任何Java应用程序), Stack trace都会写入控制台(在本例中为logcat)。 此堆栈跟踪包含解决您的问题的重要信息。

Android Studio

在Android Studio中查找堆栈跟踪

在窗口的底部栏中,单击Androidbutton。 或者,您可以按alt + 6 。 确保在“ Devices面板中select了您的模拟器或设备。 接下来,尝试find红色的堆栈轨迹。 可能有很多东西login到logcat,所以你可能需要滚动一下。 find堆栈跟踪的简单方法是清除logcat(使用右侧的回收站),然后让应用程序再次崩溃。

在Eclipse中查找堆栈跟踪

点击右上angular的DDMSbutton。 如果不存在,则可能需要先使用Javabutton左侧的“ Open Perspectivebutton来添加它。 您将在底部findlogcat窗格。 首先,确保您的设备已经被选中了。 接下来,尝试find红色的堆栈轨迹。 同样,可能有很多东西login到logcat,所以你可能需要滚动一下。 在这里find堆栈跟踪的简单方法是清除logcat(使用右上angular的clear logbutton),然后让应用程序再次崩溃。 您还应该点击您的应用程序的包名称,如果它尚未被选中。 这将只过滤掉你的应用程序所做的日志消息。

我发现堆栈跟踪,现在是什么?

好极了! 你是解决你的问题的一半。
您只需要通过分析堆栈跟踪来查明究竟是什么导致了应用程序崩溃。

请阅读“ 什么是堆栈跟踪,以及如何使用它来debugging我的应用程序错误 ”中的堆栈跟踪。

我仍然无法解决我的问题!

如果你发现你的Exception和它发生的地方,并且仍然无法弄清楚如何解决这个问题,请不要犹豫在StackOverflow上提出一个问题。

尝试尽可能简洁:发布堆栈跟踪和相关代码(例如,几行直到抛出Exception的行)。

您可以使用Google的ADB工具来获取Logcat file来分析问题。

 adb logcat > logcat.txt 

打开logcat.txt文件并search您的应用程序名称。 应该有关于为什么失败的信息,行号,类名等

只要检查日志猫的错误。

你在eclipse中得到log cat选项:

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

日志猫包含错误。

其他方面,您也可以通过在debugging模式下执行应用程序来检查错误。 先做一个断点,然后做:

右键单击project-> debug as-> Android应用程序

首先你检查你的应用程序崩溃的点( Unfortunately, MyApp has stopped. )。 为此,您可以使用Log.e("TAG","Message"); ,使用这一行,你可以看到你的应用程序loginlogcat。

之后,你会发现你的应用停止了哪一点,很容易在你身边解决。

注意:这个答案是使用Android Studio 2.2.2

注2: 我正在考虑您的设备已成功连接。


当你的应用程序崩溃的时候你要做的第一件事就是查看LogCat,在Android Studio的底部有一个带有一系列菜单的工具栏:

图片

点击“Android监视器”(我在上图中加下划线的那个^)

现在,你会得到这样的东西:

图片

将“ Verbose ”更改为“ Error ”现在,它只会显示您logging的错误。 现在不要担心所有这些错误(如果你有这些错误)。

图片

好。 现在,请执行您的操作以使应用程序崩溃。 你的应用程序崩溃后,转到你的logcat。 您应该find一个新的崩溃日志,其中包含大量的at:xxx :和Caused by: TrumpIsPresidentException为例。 转到您的logcat中的“ Caused by:语句。

图片

在旁边 Caused By: ,应该有exception发生。 在我的情况下,这是一个RuntimeException在它下面应该有一个包含蓝色链接的行,例如:

图片

如果Caused by:没有在其下的某个蓝色文本的行,那么寻找另一个Caused by:那是。

点击蓝色链接 。 它应该带你到问题出现的地方。 就我而言,这是由于这一行:

 throw new RuntimeException(); 

所以,现在我知道它为什么会崩溃。 这是因为我自己抛出了这个例外。 这是一个明显的错误


但是,假设我有另一个错误:

 java.lang.NullPointerException 

我检查了我的logcat,我点击了它给了我的蓝色链接,它把我带到这里:

 mTextView.setText(myString); 

所以,现在我想debugging。 根据这个StackOverflow的问题 ,一个NullPointerException说某事是null

那么,让我们来看看什么是空的 。 有两种可能性。 mTextView为null,或者myString为null。 为了find,在mTextView.setText(mString)行之前,我添加了这两行:

 Log.d("AppDebug","mTextView is null: " + String.valueOf(mTextView == null); Log.d("AppDebug","myString is null: " + String.valueOf(myString== null); 

现在,就像我们以前所做的那样(我们将Verose更改为Error),我们要将“Error”更改为“Debug”。 由于我们通过debugging进行日志logging 这里是所有的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 

所以,因为我们使用了Log.d ,所以我们在Debug中检查。 这就是为什么我们将其改为debugging。

注意Log.d有第一个参数,在我们的例子中是“AppDebug”。 点击logcat右上方的“No Filters”下拉菜单。 select“编辑filterconfiguration”,为您的filter命名,在“日志标签”中放入“应用程序debugging”。 点击“确定”。 现在,您应该在logcat中看到两行:

 yourPackageNameAndApp: mTextView is null: true yourPackageNameAndApp: myString is null: false 

所以现在我们知道mTextView是空的。

我观察我的代码,现在我注意到了一些东西。

我有private TextView mTextView声明在我的课上面。 但是,我没有定义它。

基本上我忘了在我的onCreate()中做到这一点:

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

所以这就是为什么mTextView为空,因为我忘了告诉我的应用程序是什么。 所以我添加该行,运行我的应用程序,现在应用程序不会崩溃。


这个popup窗口只显示当你的代码中的一个致命的exception,停止执行的应用程序。 它可能是任何exceptionNullPointerException,OutOfMemoryException等

最好的方法来检查是通过Logcat,如果你仍然在Android Studio开发应用程序,这是快速读取堆栈跟踪和检查应用程序的原因。

如果您的应用程序已经存在,那么您不能使用logcat。 因此,为此,您可以实施Crashlytics,为您提供发生的任何exception的错误报告。

您可以使用以下任何工具:

  1. adb logcat

  2. adb logcat> logs.txt(您可以使用编辑器打开并search错误。)

  3. eclipse logcat(如果在eclipse中不可见,请转到Windows->显示视图 – >其他 – > Android-> LogCat)

  4. Androiddebugging监视器或Android设备监视器(键入命令监视器或通过UI打开)

在这里输入图像描述

  1. Android Studio

我build议使用Androiddebugging监视器 ,这是很好的。 因为当日志过多时,eclipse挂起,并且通过adb logcatfilter和所有困难。

检查您的Logcat消息并查看您的Manifest文件。 应该有一些东西缺less像定义Activity,用户权限等。

你必须检查Stack trace

怎么做?

在IDE上检查窗体LOGCAT

如果你不能看到logcat窗口去这个path,并打开它

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

如果您正在使用Google-Api,请转到此path

adb logcat> logcat.txt

使用LogCat并尝试查找导致应用程序崩溃的原因。

如果您使用Android Studio,请查看Logcat,然后按ALT + 6

如果你使用Eclipse,那么Window – > Open Perspective – > Other – LogCat

转到LogCat,从下拉菜单中select错误。 这将包含所有必要的信息来帮助您进行debugging。 如果这没有帮助,发布LogCat作为你的问题的编辑,有人会帮助你。

在下面的showToast()方法中,您必须为上下文或应用程序上下文传递另一个参数,您可以尝试它。

  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(); } 

让我分享一个基本的Logcat分析,当你遇到一个力量closures(当应用程序停止工作)。

DOCS

从Android收集/分析日志的基本工具是logcat。

这里是关于logcat的Android页面

如果你使用android studio,你也可以检查这个LINK 。

捕获

基本上,你可以用下面的命令手工捕获logcat(或者只是在AndroidStudio中检查AndroidMonitor窗口):

 adb logcat 

有很多参数可以添加到命令中,这可以帮助您筛选和显示您想要的消息…这是个人的…我总是使用下面的命令获取消息时间戳:

 adb logcat -v time 

您可以将输出redirect到文件并在文本编辑器中进行分析。

分析

如果你的应用程序崩溃,你会得到像这样的东西:

 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 

日志的这部分显示了很多信息:

  • 发生问题时: 07-09 08:29:13.475

检查问题发生的时间非常重要…您可能会在日志中发现多个错误…您必须确定您正在检查正确的消息:)

  • 哪个应用崩溃了: com.example.khan.abc

这样,您就知道哪个应用程序崩溃了(确保您正在检查有关您的消息的日志)

  • 哪个错误: java.lang.NullPointerException

一个NULL指针exception错误

  • 有关错误的详细信息: Attempt to invoke virtual method 'void android.support.v4.app.FragmentActivity.onBackPressed()' on a null object reference

您试图从FragmentActivity对象调用onBackPressed()方法。 但是,当你这样做的时候,那个对象是null

  • 堆栈跟踪:堆栈跟踪显示您的方法调用顺序…有时,错误发生在调用方法(而不是在调用的方法)。

    在com.example.khan.abc.AudioFragment $ 1.onClick(AudioFragment.java:125)

错误发生在com.example.khan.abc.AudioFragment.java文件中,在onClick()方法内部: 125 (stacktrace显示错误发生的行)

它被称为:

 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) 

等等….

概观

这只是一个概述…并不是所有的日志都是简单的等…这只是分享的想法,并提供一个入门级的信息给你…

我希望我能帮助你…关心

如果你的应用程序由于某种原因崩溃没有良好的stacktrace。 尝试从第一行进行debugging,并逐行进行,直至崩溃。 那么你会有答案,哪一行是你的麻烦。 那么你可以把它包装到try catch块并打印错误输出。

你也可以自己得到这个错误消息,没有任何堆栈跟踪或任何进一步的错误消息。

在这种情况下,您需要确保您的Android清单configuration正确(包括从库中发生的任何清单合并以及来自库的任何活动),并特别注意清单文件中应用程序中显示的第一个活动。

不幸的应用程序崩溃替代解决scheme。

当我们的应用被任何在android或应用中没有处理的 exception强制closures时,我们会得到这个消息。

所以当我们编写代码时,我们只需要照顾它,这将节省大量的时间来跟踪android中的任何types的exception。

跟踪App中的例外情况的步骤: –

1.打开Logcat并查看exception。

如果你不能看到logcat窗口去这个path,并打开它

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

我们使用LogCat并尝试查找导致应用程序崩溃的原因。

2.尝试处理 logcat中显示的exception ,并检查可能导致exception的其他情况。

3.在您的应用程序中添加一个未捕获的exception处理程序,以消除所有其他exception。

我创build了一个类MyExceptionHandler implementsThread.UncaughtExceptionHandler

 public class MyExceptionHandler implements Thread.UncaughtExceptionHandler { private final Context myContext; private final Class<?> myActivityClass; public MyExceptionHandler(Context context, Class<?> c) { myContext = context; myActivityClass = c; } public void uncaughtException(Thread thread, Throwable exception) { StringWriter stackTrace = new StringWriter(); exception.printStackTrace(new PrintWriter(stackTrace)); System.err.println(stackTrace); // You can use LogCat too Intent intent = new Intent(myContext, myActivityClass); intent.putExtra("uncaughtException", "Exception : " + stackTrace.toString()); intent.putExtra("stacktrace", s); myContext.startActivity(intent); //for restarting the Activity Process.killProcess(Process.myPid()); System.exit(0); } 

}

II)。在任何类别或活动或片段中处理exception。

 //We need to Caught the Unwanted exception whihc is not handled by Android: Thread.setDefaultUncaughtExceptionHandler(new MyExceptionHandler(this, SplashScreen.class)); 

如果应用程序崩溃,它将重新启动相同的活动。