【问题标题】:How to crash an Android app programmatically?如何以编程方式使 Android 应用程序崩溃?
【发布时间】:2012-08-02 04:31:53
【问题描述】:

我想使用acra 测试崩溃报告,但第一步是我需要使用代码在 Android 中模拟致命崩溃。

有什么想法吗?

【问题讨论】:

    标签: java android eclipse


    【解决方案1】:
    Just execute this code: divide by zero
    

    更新:也可以试试这个 创建一个方法,

    public void stackOverflow() {
            this.stackOverflow();
    
        }
    

    然后在某处调用它/buttonClick

    或者只是抛出一个未捕获的异常

    throw new RuntimeException("This is a crash");
    

    宾果游戏!

    【讨论】:

    • “或者简单地抛出一个未捕获的异常”也许你可以添加第三个解决方案抛出一个捕获的异常?或者我自己做:)
    【解决方案2】:
    1. 访问未定义的视图。
    2. 无需检查即可访问空列表的第一个元素。
    3. 除以零。
    4. 把设备扔出窗外。
    5. 将设备浸入水中。

    【讨论】:

    • 4.和 5. 看起来很有前途
    • 同意你的最后一句话以及 4 和 5 是可靠的点可能是让设备越界异常;P
    • 如果你是新手,这并不傻。对于刚接触 Android 或一般编程的人来说,没有问题是愚蠢的。
    【解决方案3】:

    不要在 Android Manifest 中声明活动。

    【讨论】:

      【解决方案4】:

      您可以尝试空指针异常。

      Integer i = null;
      

      然后调用对象上的任何方法。

      i.byteValue();
      

      在尚未初始化的对象上调用方法会使应用程序崩溃。

      【讨论】:

      • 你最后的说法不正确。对未初始化的变量调用方法将无法编译。
      • 如果您将 i 声明为一个字段(公共),它将编译(似乎是我做的)。我认为史蒂夫指的是我是否是本地人。
      • 你可以在它前面加上if (1==1)来欺骗编译器来编译它。
      【解决方案5】:

      一种非常简单的方法...了解它发生的原因非常重要。

      尝试在onCreate() 中的setContentView() 方法之前初始化一个变量,然后使用它来调用方法或变量或尝试将其注册到某个侦听器..

      例如:

      Button b;
      
      public void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
      
              b = (Button)findViewById(R.id.butt);
              b.setOnClickListener(new OnClickListener() {
      
              @Override
              public void onClick(View arg0) {
      
      
              }
          });
              setContentView(R.layout.main);
      
      
          }
      

      这崩溃了,因为 之前 setContentView() ma​​in.xml 布局中的组件/视图都没有得到它们的 id。

      【讨论】:

      • 这不会崩溃,因为您只是将 b 设置为 null,而不是尝试访问它。
      【解决方案6】:

      只需在你的 main.xml 中创建一个像这样的按钮:

       <Button
          android:id="@+id/button1"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:onClick="crash"
          android:text="Crash me" />
      

      然后运行您的应用并点击崩溃

      【讨论】:

        【解决方案7】:

        我知道的最简单的方法是:抛出 null。

        您不能抛出 null,因此会引发 NullPointerException。

        throw null;
        

        【讨论】:

        • “你不能抛出 null”——是的,你可以 :) 这正是你在这里所做的——所以 dwn
        【解决方案8】:

        您可能会因简单的空点异常而崩溃。

         throw new NullPointerException();
        

        【讨论】:

          【解决方案9】:

          除了@vinnet-shukla 答案:

          “或者只是抛出一个未捕获的异常”

          抛出未捕获的异常来导致崩溃是个坏主意,因为异常可能会在堆栈中更高的位置被捕获 - 特别是当我们不知道我们现在在哪里时:)

          更优雅的方式是使用ERROR

          错误是 Throwable 的子类,表示合理的应用程序不应尝试捕获的严重问题。大多数此类错误是异常情况。 ThreadDeath 错误虽然是“正常”情况,但也是 Error 的子类,因为大多数应用程序不应尝试捕获它。

          所以我们可以创建自己的 Error 子类并使用它:

          /*
           * usage:
           * 
           *   CrashError.doCrash(); 
           *
           */
          public class CrashError extends Error {
          
              public CrashError() { 
                  this("simulated crash");
              }
          
              public CrashError(String msg) {
                  super(msg);
              }
          
              public static void doCrash() {
                  throw new CrashError();
              }
          
          }
          

          但如果我们谈论其他可能性,我们也可以抛出检查异常:)

          这也是一个教训,我们如何使用 sun.misc.Unsafe 以外的其他方式重新抛出检查的异常:),尤其是当该类在 VM 实现中不可用时

          @SuppressWarnings("unchecked")
          public static <E extends Throwable> void throwAnyT(Throwable e) throws E {
              throw (E) e;
          }
          
          public static void throwUnchecked(Throwable e) {
              throwAny(e);
              // should never get there.
              throw new InternalError();
          }
          
          public static void crash() {
              throwUnchecked(new java.io.IOException("simulated crash"));
          }
          

          除了@audric 答案:

          “你不能抛出 null”

          是的,你可以 :) 这正是你在示例中所做的,是的,如果 catch 块不使用 Throwable,它可能无法检测到 - NPX 永远不会被抛出,只会有当代码仍将执行时的正常流程,是的,我会在 ANDROID DALVK 上看到并亲身体验 :)

          那么……呢?也许它可以满足您的需求?

          java 特定的(也在 android 中):

          - Runtime.getRuntime().exit(int);
          - System.exit(int);
          - Runtime.getRuntime().halt(int);
          

          具体安卓:

          - android.os.Process.killProcess(int);
          - android.os.Process.killProcessQuiet(int);
          - android.os.Process.sendSignal(int,int);
          - android.system.Os.kill(int);
          

          【讨论】:

            【解决方案10】:

            像这样延迟一段时间后强制崩溃,

            new android.os.Handler().postDelayed(
                          new Runnable() {
                              public void run() {
                                  Log.i("tag", "This'll run 10 seconds later");
                                  throw new RuntimeException("This is a crash");
                              }
                          },
                          10000);
            

            Ref-1 & Ref-2

            【讨论】:

              【解决方案11】:

              如果您使用的是 firebase crashlytics,那么有一种非常简单的方法可以做到这一点。在他们的文档中也提到了。

              val crashlytics = FirebaseCrashlytics.getInstance()
              crashlytics.log("my message")
              

              【讨论】:

                【解决方案12】:

                对于科特林:

                val test = ("0")
                println(test[1])
                

                【讨论】:

                  【解决方案13】:

                  您可以简单地使用这行代码使应用程序崩溃。

                  throw new RuntimeException("Test Crash"); // Force a crash
                  

                  您可以传递消息,在本例中为“Test Crash”,以后可以参考。

                  领先一步, 确保您的应用程序的所有类文件都没有实现 UncaughtExceptionHandler 接口,如下所示,

                  public class MyApplication extends Application implements Thread.UncaughtExceptionHandler{
                  

                  否则,上述异常或任何与此相关的异常都会被该类捕获/使用,从而不会导致应用程序崩溃。但是,您可以在下面的 uncaughtException(Thread t, Throwable e) 方法中获取该异常并采取所需的操作。在您的情况下,您将使用他们支持的 SDK 方法将其报告给 Acra。

                  @Override
                  public void uncaughtException(Thread t, Throwable e) {
                      Log.e("MyApplication", "Error", e);
                  }
                  

                  【讨论】:

                    【解决方案14】:

                    使用以下代码:

                    String xyz=null;
                    system.out.println(xyz);
                    

                    【讨论】:

                    • 您可以在 onClick 方法中使用此代码。这肯定会工作
                    猜你喜欢
                    • 1970-01-01
                    • 2014-01-05
                    • 1970-01-01
                    • 1970-01-01
                    • 2015-05-13
                    • 2021-12-26
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多