不幸的是,MyApp已经停止。 我该如何解决这个问题?
我正在开发一个应用程序,每当我运行它,我得到的消息:
不幸的是,MyApp已经停止。
我能做些什么来解决这个问题?
关于这个问题 – 明显的启发是什么是一个堆栈跟踪,我怎样才能用它来debugging我的应用程序错误? ,有很多问题说明他们的应用程序已经崩溃,没有进一步的细节。 这个问题的目的是指导新手Android程序员如何尝试自己修复问题,或者提出正确的问题。
这个答案描述了检索堆栈跟踪的过程。 已经有堆栈跟踪? 请阅读“ 什么是堆栈跟踪,以及如何使用它来debugging我的应用程序错误 ”中的堆栈跟踪?
问题
您的应用程序因为抛出未捕获的RuntimeException
而退出。
其中最常见的是NullPointerException
。
如何解决?
每次Android应用程序崩溃时(或者任何Java应用程序), Stack trace
都会写入控制台(在本例中为logcat)。 此堆栈跟踪包含解决您的问题的重要信息。
Android Studio
在窗口的底部栏中,单击Android
button。 或者,您可以按alt + 6 。 确保在“ Devices
面板中select了您的模拟器或设备。 接下来,尝试find红色的堆栈轨迹。 可能有很多东西login到logcat,所以你可能需要滚动一下。 find堆栈跟踪的简单方法是清除logcat(使用右侧的回收站),然后让应用程序再次崩溃。
蚀
点击右上angular的DDMS
button。 如果不存在,则可能需要先使用Java
button左侧的“ Open Perspective
button来添加它。 您将在底部findlogcat窗格。 首先,确保您的设备已经被选中了。 接下来,尝试find红色的堆栈轨迹。 同样,可能有很多东西login到logcat,所以你可能需要滚动一下。 在这里find堆栈跟踪的简单方法是清除logcat(使用右上angular的clear log
button),然后让应用程序再次崩溃。 您还应该点击您的应用程序的包名称,如果它尚未被选中。 这将只过滤掉你的应用程序所做的日志消息。
我发现堆栈跟踪,现在是什么?
好极了! 你是解决你的问题的一半。
您只需要通过分析堆栈跟踪来查明究竟是什么导致了应用程序崩溃。
请阅读“ 什么是堆栈跟踪,以及如何使用它来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的错误报告。
您可以使用以下任何工具:
adb logcat
adb logcat> logs.txt(您可以使用编辑器打开并search错误。)
eclipse logcat(如果在eclipse中不可见,请转到Windows->显示视图 – >其他 – > Android-> LogCat)
- Androiddebugging监视器或Android设备监视器(键入命令监视器或通过UI打开)
- 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));
如果应用程序崩溃,它将重新启动相同的活动。
- Android在TableLayout中均匀拉伸列
- 在Android上创build新项目,错误:Studio未知主机'services.gradle.org'
- 将项目导入到Android Studio中有关ActionBarSherlock的问题
- ListView滚动到选定的项目
- 如何在Android中启用USBdebugging?
- RadioButton – 如何使用自定义drawable?
- Android Studio找不到与com.android.support:appcompat-v7:+相匹配的任何版本
- 我应该使用AsyncTask还是IntentService?
- 如何debuggingapk签名发布?