如何以编程方式使 Android 应用程序崩溃?

Posted

技术标签:

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

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

有什么想法吗?

【问题讨论】:

【参考方案1】:
Just execute this code: divide by zero

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

public void ***() 
        this.***();

    

然后在某处调用它/buttonClick

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

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

宾果游戏!

【讨论】:

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

【讨论】:

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_
    android:layout_
    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 方法中使用此代码。这肯定会工作

以上是关于如何以编程方式使 Android 应用程序崩溃?的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式“重新启动”android应用程序[重复]

如何使反应原生的android应用程序崩溃

以编程方式在 Android 中使应用程序全屏显示

尝试以编程方式添加视图时应用程序崩溃

使 Android 应用程序崩溃的最佳方法是啥?

如何使百分比指示器以编程方式在颤动中改变颜色?