Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带有.random()方法的函数在运行几次后出现故障,原因不明_Java_Android_Android Studio - Fatal编程技术网

Java 带有.random()方法的函数在运行几次后出现故障,原因不明

Java 带有.random()方法的函数在运行几次后出现故障,原因不明,java,android,android-studio,Java,Android,Android Studio,以下是日志中显示的错误: 2020-11-09 08:39:44.056 21967-21967/com.example.braintrainer E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.braintrainer, PID: 21967 java.lang.IllegalStateException: Could not execute method for android:onClick

以下是日志中显示的错误:

2020-11-09 08:39:44.056 21967-21967/com.example.braintrainer E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.braintrainer, PID: 21967
    java.lang.IllegalStateException: Could not execute method for android:onClick
        at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:414)
        at android.view.View.performClick(View.java:7448)
        at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:992)
        at android.view.View.performClickInternal(View.java:7425)
        at android.view.View.access$3600(View.java:810)
        at android.view.View$PerformClick.run(View.java:28305)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:223)
        at android.app.ActivityThread.main(ActivityThread.java:7656)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
     Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Method.invoke(Native Method)
        at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:409)
        at android.view.View.performClick(View.java:7448) 
        at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:992) 
        at android.view.View.performClickInternal(View.java:7425) 
        at android.view.View.access$3600(View.java:810) 
        at android.view.View$PerformClick.run(View.java:28305) 
        at android.os.Handler.handleCallback(Handler.java:938) 
        at android.os.Handler.dispatchMessage(Handler.java:99) 
        at android.os.Looper.loop(Looper.java:223) 
        at android.app.ActivityThread.main(ActivityThread.java:7656) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) 
     Caused by: java.lang.IllegalArgumentException: bound must be positive
        at java.util.Random.nextInt(Random.java:388)
        at com.example.braintrainer.MainActivity.generateQuestion(MainActivity.java:69)
        at com.example.braintrainer.MainActivity.checkAnswer(MainActivity.java:85)
        at com.example.braintrainer.MainActivity.pressOpt1(MainActivity.java:95)
        at java.lang.reflect.Method.invoke(Native Method) 
        at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:409) 
        at android.view.View.performClick(View.java:7448) 
        at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:992) 
        at android.view.View.performClickInternal(View.java:7425) 
        at android.view.View.access$3600(View.java:810) 
        at android.view.View$PerformClick.run(View.java:28305) 
        at android.os.Handler.handleCallback(Handler.java:938) 
        at android.os.Handler.dispatchMessage(Handler.java:99) 
        at android.os.Looper.loop(Looper.java:223) 
        at android.app.ActivityThread.main(ActivityThread.java:7656) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) 
以下是导致错误的函数的java代码: 它基本上是一个大脑训练器应用程序,可以生成数学问题,并提供四个选项供您选择。选择一个选项,然后出现下一个问题

四种pressOpt方法是屏幕上的四个按钮,用于显示答案选项

public void generateQuestion () {
        Button answer1 = (Button) findViewById(R.id.optionOne);
        Button answer2 = (Button) findViewById(R.id.optionTwo);
        Button answer3 = (Button) findViewById(R.id.optionThree);
        Button answer4 = (Button) findViewById(R.id.optionFour);
        TextView scores = (TextView) findViewById(R.id.scoreView);

        qAnswered++;

        scores.setText(Integer.toString(score) + "/" + Integer.toString(qAnswered));


        ArrayList<Button> buttons = new ArrayList<>(asList(answer1, answer2, answer3, answer4));
        int a, b;
        Random rand = new Random();
        int upperbound = 10;
        upperbound = rand.nextInt(50);
        while (upperbound < 2)
            upperbound = rand.nextInt(50);
        Log.i("upperbound", Integer.toString(upperbound));
        a = rand.nextInt(upperbound);
        upperbound = rand.nextInt(50);
        b = rand.nextInt(upperbound);
        answer = a + b;
        Log.i("a", Integer.toString(a));
        Log.i("b", Integer.toString(b));
        TextView question = (TextView) findViewById(R.id.questionView);
        question.setText(Integer.toString(a) + " + " + Integer.toString(b));
        int id = rand.nextInt(4);
        buttons.get(id).setText(Integer.toString(answer));
        for ( int i = 0; i<4; i++) {
            if ( i != id)
            {
                upperbound = rand.nextInt(50);
                while (upperbound < 2)
                    upperbound = rand.nextInt(50);

                int Fa = rand.nextInt(upperbound);
                upperbound = rand.nextInt(50);
                int Fb = rand.nextInt(upperbound);
                int falseAnswer = Fa + Fb;
                buttons.get(i).setText(Integer.toString(falseAnswer));
            }
        }

    }

    public void checkAnswer (boolean answerIs) {
        if (answerIs) {
           //correct
            score++;
        }
        else {
            //incorrect
        }
        generateQuestion();
    }

    public void pressOpt1 (View view) {
        Button answer1 = (Button) findViewById(R.id.optionOne);
        if (Integer.toString(answer).equals(answer1.getText()))
        {
            checkAnswer(true);
        }
        else {
            checkAnswer(false);
        }
    }

    public void pressOpt2 (View view) {
        Button answer1 = (Button) findViewById(R.id.optionTwo);
        if (Integer.toString(answer).equals(answer1.getText()))
        {
            checkAnswer(true);
        }
        else {
            checkAnswer(false);
        }
    }

    public void pressOpt3 (View view) {
        Button answer1 = (Button) findViewById(R.id.optionThree);
        if (Integer.toString(answer).equals(answer1.getText()))
        {
            checkAnswer(true);
        }
        else {
            checkAnswer(false);
        }
    }

    public void pressOpt4 (View view) {
        Button answer1 = (Button) findViewById(R.id.optionFour);
        if (Integer.toString(answer).equals(answer1.getText()))
        {
            checkAnswer(true);
        }
        else {
            checkAnswer(false);
        }
    }
public void generateQuestion(){
按钮应答1=(按钮)findViewById(R.id.optionOne);
按钮应答2=(按钮)查找视图id(R.id.optionTwo);
按钮应答3=(按钮)findViewById(R.id.OptionTree);
按钮应答4=(按钮)查找视图id(R.id.optionFour);
TextView得分=(TextView)findViewById(R.id.scoreView);
qAnswered++;
scores.setText(Integer.toString(score)+“/”+Integer.toString(qAnswered));
ArrayList按钮=新建ArrayList(asList(应答1、应答2、应答3、应答4));
INTA,b;
Random rand=新的Random();
int上限=10;
上限=下一次随机数(50);
while(上限<2)
上限=下一次随机数(50);
Log.i(“上限”,Integer.toString(上限));
a=随机数,下标(上限);
上限=下一次随机数(50);
b=随机数下一个(上界);
答案=a+b;
Log.i(“a”,Integer.toString(a));
Log.i(“b”,Integer.toString(b));
TextView问题=(TextView)findViewById(R.id.questionView);
setText(Integer.toString(a)+“+”+Integer.toString(b));
int id=rand.nextInt(4);
get(id).setText(Integer.toString(answer));

对于(inti=0;i我假设当随机数返回0,并且使用0作为下一个上界时,会发生这种情况

在两种情况下,您可以确保上限大于2,但在其他情况下,您不能

我建议您将所有事件更改为:

do { upperbound = rand.nextInt(50); }
while (upperbound < 2)
do{upperbound=rand.nextInt(50);}
while(上限<2)

要确保这一点,everywhere

这是否回答了您的问题?我建议您不要运行您认为正在运行的代码。绑定必须为正-我看到了。但我甚至做了检查,以确保绑定大于2(以确保),但仍然不起作用。代码运行了几次,然后随机崩溃。我没有运行我认为正在运行的代码?怎么会这样?如果你没有保存、没有重新编译或没有重新部署,怎么会这样,但是@Tobi有答案。是的。这起作用了。我不知道我怎么没有看到其他上限分配!非常感谢