studio - java android教程




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

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

问题

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

如何解决它?

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

Android Studio

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

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

好极了! 你解决问题的一半。
通过分析堆栈跟踪,您只需要找出确切导致应用程序崩溃的原因。

在“ 什么是堆栈跟踪,以及如何使用它来调试我的应用程序错误? ”中,阅读堆栈跟踪信息。

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

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

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

我正在开发一个应用程序,每次运行它时,都会收到以下消息:

不幸的是,MyApp已经停止。

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

关于这个问题 - 明显受到什么是堆栈跟踪的启发,以及如何使用它来调试我的应用程序错误? ,有很多问题表明他们的应用程序崩溃了,没有任何进一步的细节。 这个问题旨在指导新手Android程序员如何自己尝试解决他们的问题,或者提出正确的问题。


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

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

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

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

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

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

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

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

如果由此Caused by:没有在其下的某个蓝色文本的行,则查找另一个Caused by:由此Caused by:

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

throw new RuntimeException();

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

但是,让我们说我有另一个错误:

java.lang.NullPointerException

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

mTextView.setText(myString);

所以,现在我想调试。 根据NullPointerException ,一个NullPointerException异常表示某些内容为null

那么,让我们来看看什么是空的 。 有两种可能性。 要么mTextView为null,要么myString为null。 为了找到,在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”。 由于我们通过调试进行记录。 这里是所有的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中检查。 这就是为什么我们将其改为调试。

注意Log.d有第一个参数,在我们的例子中是“AppDebug”。 点击logcat右上方的“No Filters”下拉菜单。 选择“编辑过滤器配置”,为过滤器命名,在“日志标签”中输入“应用程序调试”。 点击“确定”。 现在,您应该在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为空,因为我忘记告诉我的应用程序它是什么。 因此,我添加该行,运行我的应用程序,现在应用程序不会崩溃。


你必须检查Stack trace

怎么做?

在IDE上检查窗体LOGCAT

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

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

如果您使用Google-Api,请转到此路径

adb logcat> logcat.txt


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

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

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

转到LogCat,从下拉菜单中选择错误。 这将包含帮助您调试的所有必需信息。 如果这没有帮助,请将LogCat作为对您问题的编辑,并且有人会帮助您解决问题。


只需检查日志猫的错误。

你在eclipse中获得log cat选项:

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

日志猫包含错误。

其他方面,您也可以通过在调试模式下执行应用程序来检查错误。 首先通过这样做来设置断点:

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


在下面的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();
}

您也可以自行获取此错误消息,而无需任何堆栈跟踪或任何其他错误消息。

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


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

adb logcat > logcat.txt

打开logcat.txt文件并搜索您的应用程序名称。 应该有关于它失败的原因,行号,类名等信息。


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


让我分享一个基本的Logcat分析,以了解您什么时候遇到Force Close(应用停止工作时)。

DOCS

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

HERE是关于logcat的Android页面

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

捕获

基本上,您可以使用以下命令手动捕获logcat(或仅检查AndroidStudio中的AndroidMonitor窗口):

adb logcat

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

adb logcat -v time

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

分析

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

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

空指针异常错误

  • 有关错误的详细信息: 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)

等等....

概观

这只是一个概述...并不是所有的日志都很简单等......它只是分享这个想法并为您提供入门级的信息......

我希望我可以帮助你......关心





android