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

yruzcnhs  于 2021-06-30  发布在  Java
关注(0)|答案(13)|浏览(554)

我正在开发一个应用程序,每次运行它时,我都会收到这样的消息:
不幸的是,myapp已经停止。
我能做些什么来解决这个问题?
关于这个问题——显然是受什么是堆栈跟踪以及如何使用它来调试应用程序错误的启发,有很多问题表明它们的应用程序已经崩溃,没有任何进一步的细节。这个问题旨在指导android新手如何尝试自己解决问题,或者提出正确的问题。

wqsoz72f

wqsoz72f1#

只需检查一下log cat中的错误。
您可以从eclipse中获得log cat选项:
窗口->显示视图->其他->android->logcat
日志cat包含错误。
另外,还可以通过在调试模式下执行应用程序来检查错误。首先通过以下操作设置断点:
右击project->debug as->android应用程序

dohp0rv5

dohp0rv52#

首先,检查应用程序崩溃的点( Unfortunately, MyApp has stopped. ). 为此,您可以使用 Log.e("TAG", "Message"); ,使用这一行,您可以在logcat中看到您的应用程序日志。
之后,你发现哪一点你的应用程序已经停止它很容易在你身边解决。

klr1opcd

klr1opcd3#

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

问题

您的应用程序退出是因为 RuntimeException 被扔了。
其中最常见的是 NullPointerException .

如何解决?

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

安卓工作室


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

我找到了烟囱的痕迹,现在怎么办?

耶!你的问题已经解决了一半。
您只需要通过分析堆栈跟踪来找出究竟是什么导致了应用程序崩溃。
阅读“什么是堆栈跟踪,如何使用它调试应用程序错误”中的堆栈跟踪

我还是解决不了我的问题!

如果你找到了你的 Exception 以及它发生的那一行,仍然不知道如何修复它,不要犹豫,问一个关于stackoverflow的问题。
尽量简洁:发布堆栈跟踪和相关代码(例如,在抛出 Exception ).

w1jd8yoj

w1jd8yoj4#

你可以使用谷歌的adb工具 Logcat file 分析问题。

adb logcat > logcat.txt

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

kx7yvsdv

kx7yvsdv5#

使用logcat并尝试找出导致应用程序崩溃的原因。
如果您使用android studio,则按alt+6或
如果您使用eclipse,那么window->openperspective->other-logcat
转到logcat,从下拉菜单中选择error。这将包含帮助您调试所需的所有信息。如果这没有帮助,张贴日志作为编辑你的问题,有人会帮助你。

yacmzcpb

yacmzcpb6#

如果你的应用程序由于某种原因崩溃而没有良好的stacktrace。试试德布

h5qlskok

h5qlskok7#

此弹出窗口仅在代码中出现致命异常时显示,该异常会停止应用程序的执行。这可能是任何例外 NullPointerException , OutOfMemoryException 等。
如果你还在androidstudio中开发应用程序,最好的检查方法是通过logcat,这是一种快速读取堆栈跟踪并检查应用程序原因的方法。
如果您的应用程序已处于活动状态,则无法使用logcat。所以,你可以实现 Crashlytics 向您提供发生的任何异常的bug报告。

velaa5lx

velaa5lx8#

在下面的showtoast()方法中,您必须为context或application context传递另一个参数,这样您就可以尝试了。

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

wko9yo5t9#

让我分享一个基本的logcat分析,当你遇到一个强制关闭(当应用程序停止工作)。
文件
android收集/分析日志的基本工具是logcat。
这是android关于logcat的页面
如果你使用androidstudio,你也可以查看这个链接。
捕捉
基本上,您可以使用以下命令手动捕获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. 这样,您就知道哪个应用程序崩溃了(确保您正在检查有关消息的日志)
哪个错误: java.lang.NullPointerException 空指针异常错误
有关错误的详细信息: Attempt to invoke virtual method 'void android.support.v4.app.FragmentActivity.onBackPressed()' on a null object reference 你试图调用方法 onBackPressed()FragmentActivity 对象。然而,这个物体是 null 当你这么做的时候。
堆栈跟踪:堆栈跟踪显示方法调用顺序。。。有时,错误发生在调用方法中(而不是在被调用方法中)。
在com.example.khan..audiofragment$1.onclick(audiofragment。java:125)
文件中发生错误 com.example.khan..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)

等。。。。
概述
这只是一个概述。。。不是所有的日志都很简单,但是错误给出了具体的问题,详细的日志显示了所有的问题。。。它只是分享的想法,并提供入门级的信息给你。。。
我希望我能帮你。。。当做

k7fdbhmy

k7fdbhmy10#

检查您的 Logcat 留言并查看您的 Manifest 文件。应该缺少一些东西,比如定义 Activity, 用户权限等。

66bbxpm5

66bbxpm511#

您可以使用以下任何工具:
adb日志
adb logcat>logs.txt(可以使用编辑器打开和搜索错误。)
eclipse logcat(如果在eclipse中不可见,请转到windows->show view->others->android->logcat)
android调试监视器或android设备监视器(键入command monitor或通过ui打开)

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

k4aesqcs

k4aesqcs12#

你得检查一下 Stack trace 怎么做?
在ide上检查windows窗体logcat
如果看不到logcat窗口,请转到此路径并打开它

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

如果您使用的是googleapi,请转到以下路径
adb logcat>logcat.txt

nzk0hqpo

nzk0hqpo13#

注意:这个答案使用的是androidstudio2.2.2
注意2:我认为您的设备已成功连接。
当你的应用程序崩溃时,你要做的第一件事就是查看logcat,在android studio的底部有一个带有菜单列表的工具栏:

点击“安卓显示器”(我在上图中画了下划线的那一个)
现在,你会得到这样的结果:

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

好 啊。现在,做你做了什么崩溃你的应用程序。应用程序崩溃后,请转到日志。你应该找到一个新的崩溃日志有很多 at:x.x.x :和 Caused by: TrumpIsPresidentException 例如。去吧 Caused by: 在你的日志里的声明。

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

如果那样的话 Caused by: 下面没有蓝色文字的行,然后再找一行 Caused by: 是的。
点击那个蓝色链接。它应该把你带到问题发生的地方。就我而言,这是因为这句话:

throw new RuntimeException();

所以,现在我知道它为什么崩溃了。因为我自己也在抛出异常。这是一个明显的错误。
但是,假设我有另一个错误:

java.lang.NullPointerException

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

mTextView.setText(myString);

所以,现在我要调试。根据这个stackoverflow问题,nullpointerexception表示 null .
那么,让我们找出什么是空的。有两种可能。或者 mTextView 为空,或 myString 为空。为了找出答案,在 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.
  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右上角的“无过滤器”下拉菜单。选择“编辑过滤器配置”,为过滤器命名,并在“日志标签”中输入“应用程序调试”。单击“确定”。现在,您应该在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 是空的,因为我忘了告诉我的应用程序它是什么。所以我加上那句话,运行我的应用程序,现在应用程序不会崩溃。

相关问题