Java 不幸的是,MyApp已经停止。我怎样才能解决这个问题?

Java 不幸的是,MyApp已经停止。我怎样才能解决这个问题?,java,android,debugging,kotlin,Java,Android,Debugging,Kotlin,我正在开发一个应用程序,每次运行它时,我都会收到以下信息: 不幸的是,MyApp已经停止 我能做些什么来解决这个问题 关于这个问题-显然是受到启发,有很多问题表明他们的应用程序已经崩溃,没有任何进一步的细节。此问题旨在指导Android新手程序员如何尝试自己解决问题,或提出正确的问题。此答案描述了检索堆栈跟踪的过程。已经有堆栈跟踪了吗?读取中的堆栈跟踪 问题 您的应用程序退出,因为引发了未捕获的RuntimeException。 其中最常见的是 如何解决? 每次Android应用程序崩溃或任何J

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

不幸的是,MyApp已经停止

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

关于这个问题-显然是受到启发,有很多问题表明他们的应用程序已经崩溃,没有任何进一步的细节。此问题旨在指导Android新手程序员如何尝试自己解决问题,或提出正确的问题。

此答案描述了检索堆栈跟踪的过程。已经有堆栈跟踪了吗?读取中的堆栈跟踪

问题 您的应用程序退出,因为引发了未捕获的RuntimeException。 其中最常见的是

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

安卓工作室 在窗口的底部栏中,单击Logcat按钮。或者,您可以按alt+6。确保在“设备”面板中选择了仿真器或设备。接下来,尝试查找堆栈跟踪,它显示为红色。可能有很多东西登录到logcat,所以您可能需要滚动一点。找到堆栈跟踪的一个简单方法是使用右侧的回收站清除logcat,然后让应用程序再次崩溃

我找到了堆栈跟踪,现在怎么办? 耶!你的问题已经解决了一半。 通过分析堆栈跟踪,您只需找出到底是什么导致了应用程序崩溃

读取中的堆栈跟踪

我还是不能解决我的问题! 如果您已经找到了异常及其发生的行,但仍然无法确定如何修复它,请毫不犹豫地询问有关StackOverflow的问题


尽量简明扼要:发布堆栈跟踪和相关代码,例如,在引发异常的行之前的几行。

首先,检查应用程序崩溃的点不幸的是,MyApp已停止。。为此,可以使用Log.eTAG,Message;,使用这一行,您可以在logcat中查看您的应用程序日志


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

您也可以自行获取此错误消息,而无需任何堆栈跟踪或任何进一步的错误消息

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

您可以使用获取Logcat文件来分析问题

adb logcat > logcat.txt

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

只需检查日志cat中的错误即可

在eclipse中,您可以从中获得log cat选项:

窗口->显示视图->其他->安卓->日志猫

日志cat包含错误

另外,您还可以通过在调试模式下执行应用程序来检查错误。 首先设置断点,然后执行以下操作:

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

检查Logcat消息并查看清单文件。应该缺少定义活动、用户权限等内容。

您必须检查堆栈跟踪

怎么做

在IDE上检查windows窗体LOGCAT

如果看不到logcat窗口,请转到此路径并将其打开

window->show view->others->Android->Logcat
如果您正在使用Google Api,请转到此路径


adb logcat>logcat.txt

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

亚洲开发银行日志

adb logcat>logs.txt您可以使用编辑器打开和搜索错误

eclipse logcat如果在eclipse中不可见,请转到Windows->Show View->Others->Android->logcat

Android调试监视器或Android设备监视器类型命令监视器或通过UI打开

安卓工作室 我建议使用Android调试监视器,它很好。因为当有太多日志时,eclipse会挂起,并且通过adb logcat筛选器和所有操作都很困难。

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

若要查看Logcat,请使用Android Studio,然后按ALT+6 或

如果您使用Eclipse,那么 窗口->打开透视->其他-日志猫


转到LogCat,从下拉菜单中选择错误。这将包含帮助您调试所需的所有信息。如果这样做没有帮助,请将日志猫作为问题的编辑发布,有人会帮你解决问题。

让我分享一个基本的日志猫分析,当你遇到强制关闭时,应用程序停止工作

文件

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

Android的页面是关于logcat的吗

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

捕获

基本上,您可以使用 使用以下命令或只需检查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 空指针异常错误

有关错误的详细信息:尝试对空对象引用调用虚拟方法“void android.support.v4.app.FragmentActivity.onBackPressed” 您试图从FragmentActivity对象调用onBackPressed方法。但是,当您这样做时,该对象是空的

堆栈跟踪:堆栈跟踪显示方法调用顺序。。。有时,错误发生在调用方法中,而不是被调用的方法中

在com.example.khan.abc.AudioFragment$1.onClickAudioFragment.java:125

文件com.example.khan.abc.AudioFragment.java中发生错误,第125行的onClick方法中显示了发生错误的行

它被称为:

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.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.view.View.performClick(View.java:4848)
at android.view.View$PerformClick.run(View.java:20262)
at android.os.Handler.handleCallback(Handler.java:815)
等等

概述

这只是一个概述。。。并非所有日志都很简单,但错误给出了具体问题,详细说明了所有问题。。。这只是分享想法,并提供入门级的信息给你

我希望我能以某种方式帮助你。。。 注意:这个答案使用的是Android Studio 2.2.2

注2:我认为您的设备已成功连接

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

点击我在上图中划线的安卓显示器^

现在,您将得到如下结果:

现在将Verbose更改为Error,它将只显示记录的错误。如果你现在就知道了,不要担心所有这些错误

嗯。现在,做你所做的使你的应用程序崩溃的事情。应用程序崩溃后,请转到logcat。您应该找到一个新的崩溃日志,该日志包含大量的at:x.x.x:,例如由:TrumpIsPresidentException引起的。转到日志中的:声明引起的

除了由以下原因引起的异常之外,应该还有发生的异常。在我的例子中,这是一个RuntimeException,在它下面应该有一行包含蓝色链接,例如:

如果这是由:引起的,在它下面的某个地方没有一行蓝色文本,那么寻找另一行是由:引起的

点击那个蓝色链接。它应该把你带到问题发生的地方。就我而言,这是因为这句话:

throw new RuntimeException();
所以,现在我知道它为什么会崩溃了。这是因为我自己抛出了异常。这是一个明显的错误

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

java.lang.NullPointerException
我查看了我的日志,点击了它给我的蓝色链接,它把我带到了这里:

mTextView.setText(myString);
所以,现在我想调试。根据,NullPointerException表示某个东西是空的

那么,让我们找出什么是空的。有两种可能性。mTextView或myString为null。为了找到答案,在mTextView.setTextmString行之前,我添加了以下两行:

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.
  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。这就是为什么我们把它改为debug

注意Log.d有第一个参数,在我们的例子中是AppDebug。单击logcat右上角的无过滤器下拉菜单。选择编辑过滤器配置,为过滤器命名,并在日志标记中放入应用程序调试。单击“确定”。现在,您应该在logcat中看到两行:

yourPackageNameAndApp: mTextView is null: true
yourPackageNameAndApp: myString is null: false
现在我们知道mTextView是空的

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

我在类的顶部声明了私有TextView mTextView。但是,我没有定义它

基本上,我忘记在onCreate中执行此操作:

mTextView = (TextView) findViewById(R.id.textview_id_in_xml);
这就是为什么mTextView是空的,因为我忘了告诉我的应用程序它是什么。所以我添加了这一行,运行我的应用程序,现在应用程序不会崩溃


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

此弹出窗口仅在代码中出现致命异常时显示,该异常会停止应用程序的执行。它可以是任何异常NullPointerException、OutOfMemoryException等

最好的方法 如果您仍在Android studio中开发应用程序,请通过Logcat进行检查,这是读取堆栈跟踪和检查应用程序原因的快速方法


如果您的应用程序已处于活动状态,则无法使用logcat。因此,您可以实现Crashlytics,为发生的任何异常提供bug报告。

如果您的应用程序由于某种原因在没有良好的stacktrace的情况下崩溃。试着从第一行开始调试它,然后逐行调试直到崩溃。然后你们会得到答案,哪一行给你们带来了麻烦。当然,您可以将其包装到try-catch块中并打印错误输出。

人们会犯错,因此编码也会出错

当发生任何错误时,始终使用红色文本与logcat进行检查,但是您可以在蓝色文本中找到真正的问题,并在红色文本中加下划线

确保在创建新活动时,始终在AndroidManifest文件中声明该活动

如果添加权限,也在AndroidMainiTest文件中声明它。

在开发过程中崩溃 尝试我最喜欢的工具来获取日志,并在开发过程中对其进行分析。 确保在Linux中运行时将./logview和./lib/logview.jar标记为可执行文件

如果你不喜欢,还有很多选择

野外坠落 集成实时崩溃报告工具,例如,以便获取用户设备上发生的未处理异常的堆栈跟踪

阅读了解更多关于处理现场bug的信息。

Logcat-查看Android Studio开发阶段的日志

首先清除Logcat,让应用程序再次崩溃,这样您就只能获得崩溃日志的详细信息。您必须检查堆栈跟踪

不幸的是,MyApp已经停止。原因有很多。您可以在日志中检查相同的内容。为此,您可以使用Log.eTAG,Message

应用程序崩溃期间的常见错误,如:

编码错误,关键字使用错误。 属性名称不匹配。 不支持的pluginmabe。 不匹配的版本可能是。 AndroidManifest文件中缺少活动。 AndroidManifest文件中缺少权限。 最常见的NullPointerException。 已声明但未定义。 要解决应用程序崩溃错误,请执行以下操作:

记住以上几点,并仔细检查。 当出现错误时,您将得到同样为蓝色的文件名,单击它们并跳转到发生错误时的代码。
首先,你需要检查你的应用程序在哪里以及为什么会崩溃不幸的是,MyApp已经停止。。在日志的帮助下,你可以找出哪里出了问题


在此之后,您将找到应用程序停止的点,并从您的点修复该点。

如果您的终端中没有任何有趣的日志,或者它们与您的应用程序没有直接关系,则您的问题可能是由于本机库造成的。在这种情况下,您应该检查终端中的墓碑文件

墓碑文件的默认位置取决于每个设备,但如果是这种情况,您将有一个日志,告诉您:墓碑已写入:/data/tombstones/tombstone\u 06


有关更多信息,请查看。

在终端中运行此命令也有助于查找问题:

gradlew build > log.txt 2>details.txt
然后,您应该在上面的两个日志文件中转到gradlew文件位置。

如果您的应用程序在没有任何错误的情况下崩溃,并且您没有使用资产管理器,但加载了如下纹理:

Texture texture = new Texture("myImage.png"); 

这就是问题所在。我也经历过这种事。您应该始终使用资产管理器来避免内存过载。

我已经看到许多问题都被重复了。这是一个很好的参考,可以帮助人们在问题中发布相关数据。然而,这并不是任何根本问题的重复,而是挖掘根本问题的方法。我认为最好只是提供这个问题的链接作为参考,而不是重复关闭。我认为关闭功能非常适合这个问题。这些问题中的大多数显示出对基本调试技能的了解很少。搁置这些问题为他们提供了一个机会,使用答案中所述的方法来澄清他们的问题。更好的是,他们或许能够自己解决问题。不过,这个讨论可能更适合meta.stackoverflow.com。这个问题太模糊了。一个更好的问题是“使用[myIDE]如何调试”一个显示错误的Android应用程序“不幸的是,MyApp已经停止”@ChrisHalcrow这个问题与调试无关。这篇文章是关于指导Android初学者如何处理应用程序崩溃的。我知道这篇文章很老:但如果你使用IntelliJ IDEA,你可以进入Android>Devices | Logcat,添加一个新的过滤器,并通过日志消息对其进行过滤,你可以在这里输入致命异常,这样你就可以在这个框中读取应用程序抛出的所有异常。这样,您就不需要清除logcat并再次执行崩溃。我认为androidstudio也有这个选项。在Eclipse中过滤logcat可以通过在过滤器的applicationname字段中键入java包名来完成
他主要的观点是理解异常发生时的追溯。当没有追溯或没有可用的追溯时,FCs有点糟糕,这就是它变得毛茸茸的地方。但是我认为这个解释是一个很好的发现/识别这些bug的第一个介绍。当你的logcat有一些错误的痕迹时,事情很容易,但是万一logcat什么都没有呢?问题是该行不包含由堆栈跟踪写入和指出的错误。如果您可以上载一个演示此现象的项目,我会很感兴趣。这很好,它将快速向您显示设备上发生的任何事情,即使您的调试器无法捕获它,如果运行时加载失败,Xamarin可能会发生这种情况。我不明白为什么我的应用程序会在android studio logcat中崩溃,根本没有错误。这个答案给了我所需要的。然而,后来我意识到我在工作室logcat上安装了一些过滤器,这阻止了我看到错误。我切换回只显示选定的应用程序,并且我已备份并运行。您应该添加-d,否则您将切换到ctrl-C以退出logcat。我不知道adb logcat-v time-d>filename.txt这是一个很好的信息,但是-图像不能被搜索,不能被复制和粘贴,不能被屏幕阅读器拾取,并且更难阅读。顺便说一句,我没有投反对票,只是指出了这一点。