Java 启动Android活动会产生IllegalStateException/InvocationTargetException

Java 启动Android活动会产生IllegalStateException/InvocationTargetException,java,android,android-activity,Java,Android,Android Activity,我试图让我的Android应用程序更面向对象,并创建一个类(DigithHandler),用于选择从特定类型的输入调用哪个活动。当用户单击另一个名为InputCodeActivity的类中的按钮时,将调用DigitHandler DigithHandler将此launchGame方法称为: private void launchGame() { Intent intent; switch(digits[0]) { case 0:

我试图让我的Android应用程序更面向对象,并创建一个类(DigithHandler),用于选择从特定类型的输入调用哪个活动。当用户单击另一个名为InputCodeActivity的类中的按钮时,将调用DigitHandler

DigithHandler将此launchGame方法称为:

private void launchGame()
{
    Intent intent;

    switch(digits[0])
    {
        case 0:
            // Set random game from among the first three.
            int randNum = (int)(Math.random() * 3) + 1;
            digits[0] = randNum;
            // Not sure whether that will work or just have it continue to 1.
            // Not that important at the moment, since random game isn't in the specs.
        case 1:
            intent = new Intent(ctx, SimonActivity.class);
            break;
        case 2:
            intent = new Intent(ctx, SquareActivity.class);
            break;
        case 3:
            intent = new Intent(ctx, PegsActivity.class);
            break;
        case 4:
            intent = new Intent(ctx, PipesActivity.class);
            break;
        default:
            intent = new Intent(ctx, LightsActivity.class);
    }

    String difficulty = "";

    switch(digits[2])
    {
        case 1:
            difficulty = "easy";
            break;
        case 2:
            difficulty = "medium";
            break;
        case 3:
            difficulty = "hard";
            break;
    }

    intent.putExtra(GameActivity.DIFFICULTY, difficulty);

    // intent.putExtra(GameActivity.ADDITIONAL_PARAMS, barcodeData.additionalParams);

    ctx.startActivity(intent);
}
但是最后一行(开始活动)给了我一个错误。(我知道这是最后一行,因为如果我把那行注释掉,我不会得到错误。)我真的不知道是什么导致了错误。以下是错误和堆栈跟踪:

java.lang.IllegalStateException: Could not execute method of the activity

--------- Stack trace ---------

    android.view.View$1.onClick(View.java:3841)
    android.view.View.performClick(View.java:4456)
    android.view.View$PerformClick.run(View.java:18465)
    android.os.Handler.handleCallback(Handler.java:733)
    android.os.Handler.dispatchMessage(Handler.java:95)
    android.os.Looper.loop(Looper.java:136)
    android.app.ActivityThread.main(ActivityThread.java:5086)
    java.lang.reflect.Method.invokeNative(Native Method)
    java.lang.reflect.Method.invoke(Method.java:515)
    com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
    com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
    dalvik.system.NativeStart.main(Native Method)
-------------------------------

--------- Cause ---------

java.lang.reflect.InvocationTargetException

    java.lang.reflect.Method.invokeNative(Native Method)
    java.lang.reflect.Method.invoke(Method.java:515)
    android.view.View$1.onClick(View.java:3836)
    android.view.View.performClick(View.java:4456)
    android.view.View$PerformClick.run(View.java:18465)
    android.os.Handler.handleCallback(Handler.java:733)
    android.os.Handler.dispatchMessage(Handler.java:95)
    android.os.Looper.loop(Looper.java:136)
    android.app.ActivityThread.main(ActivityThread.java:5086)
    java.lang.reflect.Method.invokeNative(Native Method)
    java.lang.reflect.Method.invoke(Method.java:515)
    com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
    com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
    dalvik.system.NativeStart.main(Native Method)
-------------------------------

--------- Device ---------

Brand: motorola
Device: condor_cdma
Model: XT830C
Id: KXC21.5-40
Product: condor_tracfone
-------------------------------

--------- Firmware ---------

SDK: 19
Release: 4.4.4
Incremental: 35
-------------------------------
知道我做错了什么吗

编辑:上下文是getApplicationContext(),从当前活动中的okButtonClick()方法传递,如下所示:

public void okButtonClick(View view)
{
    theNumber = numberPad.getText().toString();
    Log.e("Recording the number", "Number is"+theNumber);
    DigitHandler dh = new DigitHandler(getApplicationContext(), theNumber);
}
DigithHandler的构造函数查找一个上下文(在DigithHandler中成为ctx并传递给launchGame())和一个字符串,即数字

编辑:使用try-catch块,我在调用目标中发现了实际的异常: “从活动上下文外部调用startActivity()需要标志\u Activity\u NEW\u TASK标志。这真的是您想要的吗?”

所以听起来我可以添加一个语句intent.setFlags(intent.FLAG\u ACTIVITY\u NEW\u TASK);让问题消失。这个警告听起来像个坏主意,但我不确定确切的原因。

发布的堆栈跟踪中没有
launchGame()
方法。问题似乎在于
视图$1.onClick
回调

是使用反射调用方法时发生的异常的包装。尝试在
onClick()
中捕获
InvocationTargetException
,并使用查找包装的异常


值得一看:

您的onButtonClick中有一个小问题。您正在将getApplicationContext()作为上下文的引用传递,但实际上您需要在此处将当前活动引用作为上下文传递

那就换一个吧

getApplicationContext() 

注意:当您需要执行任何需要电流的操作时 然后必须将当前活动作为contex传递。e、 g.为了 打开新活动需要当前活动的上下文引用 活动


如何在此类中传递上下文变量的引用。它必须是活动实例引用。您能告诉我们如何从活动类传递上下文引用吗?上下文是什么?另外,您的新活动的代码是什么?似乎您在打开新活动时遇到异常这帮助我找到了实际的异常:
Activity.this (where Activity = Name of your current Activity class)