简体   繁体   English

Android:3个活动使用相同的代码,但1次始终崩溃

[英]Android: 3 activities with the same code but 1 crashes all the time

I am building a math app that has timed multiple choice questions for addition, subtraction, multiplication, and division. 我正在构建一个数学应用程序,该应用程序已定时对多项选择题进行加,减,乘和除运算。 The code is pretty simple and is the same for each activity. 该代码非常简单,每个活动都相同。 However, My subtraction activity is very buggy and always crashes at random times. 但是,我的减法活动非常容易出错,并且总是在随机时间崩溃。 Sometimes it will crash after pressing GO, sometimes it crashes after choosing the first answer, sometimes I can get to 3 questions then it crashes. 有时按GO后会崩溃,有时会在选择第一个答案后崩溃,有时我会遇到3个问题,然后崩溃。 I'm confused because it does not happen with addition or multiplication. 我很困惑,因为加法或乘法不会发生这种情况。 I'm wondering if it has something to do with memory? 我想知道它是否与内存有关?

Anyways, here is my code and error. 无论如何,这是我的代码和错误。 Thanks in advance! 提前致谢!

import android.os.CountDownTimer;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.GridLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;


import java.util.*;

public class subActivity extends AppCompatActivity {

    Button button0;
    Button button1;
    Button button2;
    Button button3;
    TextView sub;
    Button startButton;
    TextView resultTextView;
    TextView pointsTextView;
    ArrayList<Integer> answers = new ArrayList<Integer>();
    int locationOfCorrectAnswer;
    int score = 0;
    int numberOfQuestions = 0;
    TextView timerTextView;
    Button playAgainButton;
    RelativeLayout gameRelativeLayout;
    GridLayout buttonLayout;
    float percent;

    public void playAgain(View view){
        score = 0;
        numberOfQuestions = 0;
        timerTextView.setText("30s");
        pointsTextView.setText("0/0");
        resultTextView.setText("");
        playAgainButton.setVisibility(View.INVISIBLE);
        generateQuestion();

        new CountDownTimer(30100, 1000) {

            @Override
            public void onTick(long millisUntilFinished) {
                buttonLayout.setVisibility(View.VISIBLE);
                sub.setVisibility(View.VISIBLE);
                timerTextView.setText(String.valueOf(millisUntilFinished/1000) + "s");
            }

            @Override
            public void onFinish() {
                playAgainButton.setVisibility(View.VISIBLE);
                timerTextView.setText("0s");
                resultTextView.setText("Your score:" + percent + "%\n Questions:" + Integer.toString(score) + "/" + numberOfQuestions);
                buttonLayout.setVisibility(View.INVISIBLE);
                sub.setVisibility(View.INVISIBLE);

            }
        }.start();
    }

    public void generateQuestion() {
        Random rand = new Random();

        int a = rand.nextInt(21);
        int b = rand.nextInt(21);
        int incorrectAnswer;

        sub.setText(a + " - " + b);
        locationOfCorrectAnswer = rand.nextInt(4);

        answers.clear();

        for (int i=0; i<4;i++){

            if(i == locationOfCorrectAnswer){
                answers.add(a-b);
            }
            else{

                incorrectAnswer = rand.nextInt((a-b));
                while (incorrectAnswer == a-b) {
                    incorrectAnswer = rand.nextInt((a-b));
                }
                answers.add(incorrectAnswer);
            }
        }

        button0.setText(Integer.toString(answers.get(0)));
        button1.setText(Integer.toString(answers.get(1)));
        button2.setText(Integer.toString(answers.get(2)));
        button3.setText(Integer.toString(answers.get(3)));

    }



    public void start(View view) {

        startButton.setVisibility(View.INVISIBLE);
        gameRelativeLayout.setVisibility(RelativeLayout.VISIBLE);
        playAgain(findViewById(R.id.playAgain));
    }

    public void chooseAnswer(View view) {

        if (view.getTag().toString().equals(Integer.toString(locationOfCorrectAnswer))) {
            score++;
            resultTextView.bringToFront();
            resultTextView.setText("Correct!");
            //resultTextView.setBackgroundColor(-16711936);

        } else {
            resultTextView.bringToFront();
            resultTextView.setText("Incorrect!");
            //resultTextView.setBackgroundColor(-65536);
        }
        numberOfQuestions++;
        pointsTextView.setText(Integer.toString(score) + "/" + numberOfQuestions);
        percent = Math.round((score/(float)numberOfQuestions)*100.0);             //get the percentage recieved
        generateQuestion();
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sub);

        startButton = (Button) findViewById(R.id.goButton);
        sub = (TextView) findViewById(R.id.subTextView);
        resultTextView = (TextView) findViewById(R.id.resultTextView);
        pointsTextView = (TextView) findViewById(R.id.pointsTextView);
        button0 = (Button) findViewById(R.id.button0);
        button1 = (Button) findViewById(R.id.button1);
        button2 = (Button) findViewById(R.id.button2);
        button3 = (Button) findViewById(R.id.button3);
        timerTextView = (TextView) findViewById(R.id.timerTextView);
        playAgainButton = (Button) findViewById(R.id.playAgain);
        gameRelativeLayout = (RelativeLayout) findViewById(R.id.gameRelativeLayout);
        buttonLayout = (GridLayout) findViewById(R.id.buttonLayout);


    }
}

This error shows up when it crashes: 崩溃时显示此错误:

 E/AndroidRuntime: FATAL EXCEPTION: main
                                                                            Process: com.example.jimmy.mathtime, PID: 14678
                                                                            java.lang.IllegalStateException: Could not execute method for android:onClick
                                                                                at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:293)
                                                                                at android.view.View.performClick(View.java:5224)
                                                                                at android.view.View$PerformClick.run(View.java:21356)
                                                                                at android.os.Handler.handleCallback(Handler.java:739)
                                                                                at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                                at android.os.Looper.loop(Looper.java:148)
                                                                                at android.app.ActivityThread.main(ActivityThread.java:5585)
                                                                                at java.lang.reflect.Method.invoke(Native Method)
                                                                                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730)
                                                                                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)
                                                                             Caused by: java.lang.reflect.InvocationTargetException
                                                                                at java.lang.reflect.Method.invoke(Native Method)
                                                                                at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)
                                                                                at android.view.View.performClick(View.java:5224) 
                                                                                at android.view.View$PerformClick.run(View.java:21356) 
                                                                                at android.os.Handler.handleCallback(Handler.java:739) 
                                                                                at android.os.Handler.dispatchMessage(Handler.java:95) 
                                                                                at android.os.Looper.loop(Looper.java:148) 
                                                                                at android.app.ActivityThread.main(ActivityThread.java:5585) 
                                                                                at java.lang.reflect.Method.invoke(Native Method) 
                                                                                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730) 
                                                                                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620) 
                                                                             Caused by: java.lang.IllegalArgumentException: n <= 0: -1
                                                                                at java.util.Random.nextInt(Random.java:182)
                                                                                at com.example.jimmy.mathtime.subActivity.generateQuestion(subActivity.java:84)
                                                                                at com.example.jimmy.mathtime.subActivity.chooseAnswer(subActivity.java:124)
                                                                                at java.lang.reflect.Method.invoke(Native Method) 
                                                                                at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288) 
                                                                                at android.view.View.performClick(View.java:5224) 
                                                                                at android.view.View$PerformClick.run(View.java:21356) 
                                                                                at android.os.Handler.handleCallback(Handler.java:739) 
                                                                                at android.os.Handler.dispatchMessage(Handler.java:95) 
                                                                                at android.os.Looper.loop(Looper.java:148) 
                                                                                at android.app.ActivityThread.main(ActivityThread.java:5585) 
                                                                                at java.lang.reflect.Method.invoke(Native Method) 
                                                                                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730) 
                                                                                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620) 

My XML file: 我的XML文件:

<?xml version="1.0" encoding="utf-8"?>
<android.widget.RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.jimmy.mathtime.subActivity">

    <RelativeLayout
        android:id="@+id/gameRelativeLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="invisible">

        <GridLayout
            android:id="@+id/buttonLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentStart="true"
            android:layout_below="@+id/subTextView">

            <Button
                android:id="@+id/button0"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_column="0"
                android:layout_columnWeight="1"
                android:layout_row="0"
                android:layout_rowWeight="1"
                android:background="@android:color/holo_blue_bright"
                android:onClick="chooseAnswer"
                android:tag="0"
                android:text="@string/_3"
                android:textSize="80sp" />

            <Button
                android:id="@+id/button1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_column="1"
                android:layout_columnWeight="1"
                android:layout_row="0"
                android:layout_rowWeight="1"
                android:background="@color/colorAccent"
                android:onClick="chooseAnswer"
                android:tag="1"
                android:text="@string/_3"
                android:textSize="80sp" />

            <Button
                android:id="@+id/button2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_column="0"
                android:layout_columnWeight="1"
                android:layout_row="1"
                android:layout_rowWeight="1"
                android:background="@android:color/holo_green_light"
                android:onClick="chooseAnswer"
                android:tag="2"
                android:text="@string/_3"
                android:textSize="80sp" />

            <Button
                android:id="@+id/button3"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_column="1"
                android:layout_columnWeight="1"
                android:layout_row="1"
                android:layout_rowWeight="1"
                android:background="@android:color/holo_purple"
                android:onClick="chooseAnswer"
                android:tag="3"
                android:text="@string/_3"
                android:textSize="80sp" />
        </GridLayout>

        <TextView
            android:id="@+id/subTextView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignTop="@+id/timerTextView"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="36dp"
            android:padding="10dp"
            android:text="@string/_3_x_3"
            android:textColor="@android:color/black"
            android:textSize="50sp"
            android:textStyle="bold" />

        <TextView
            android:id="@+id/timerTextView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentStart="true"
            android:layout_alignParentTop="true"
            android:layout_marginStart="15dp"
            android:layout_marginTop="14dp"
            android:padding="10dp"
            android:text="@string/_30s"
            android:textSize="30sp"
            android:textStyle="bold" />

        <Button
            android:id="@+id/playAgain"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignBottom="@+id/buttonLayout"
            android:layout_centerHorizontal="true"
            android:layout_marginBottom="65dp"
            android:background="@color/colorPrimary"
            android:onClick="playAgain"
            android:text="Play_again"
            android:textSize="30sp"
            android:visibility="invisible" />

        <TextView
            android:id="@+id/pointsTextView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentEnd="true"
            android:layout_alignTop="@+id/timerTextView"
            android:layout_marginEnd="16dp"
            android:padding="10dp"
            android:text="@string/_0_0"
            android:textSize="30sp"
            android:textStyle="bold"
            tools:ignore="RelativeOverlap" />

        <TextView
            android:id="@+id/resultTextView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_centerHorizontal="true"
            android:padding="20dp"
            android:text="@string/correct"
            android:textSize="30sp"
            android:textStyle="bold" />
    </RelativeLayout>

    <Button
        android:id="@+id/goButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:backgroundTint="@android:color/holo_blue_bright"
        android:onClick="start"
        android:padding="40dp"
        android:text="@string/go"
        android:textSize="80sp"
        android:visibility="visible" />

</android.widget.RelativeLayout>

Your exception states: 您的例外声明:

 Caused by: java.lang.IllegalArgumentException: n <= 0: -1
                                                                            at java.util.Random.nextInt(Random.java:182)
                                                                            at com.example.jimmy.mathtime.subActivity.generateQuestion(subActivity.java:84)

Basically you pass a negative value to rand.nextInt(max) method. 基本上,您将一个负值传递给rand.nextInt(max)方法。 In your code you do the following operation: 在您的代码中,执行以下操作:

incorrectAnswer = rand.nextInt((a-b));

If b is greater than a, you pass a negative number to nextInt function. 如果b大于a,则将一个负数传递给nextInt函数。 This causes your problem. 这会导致您的问题。 It is not allowed to do this. 不允许这样做。 Check if (ab)>0! 检查(ab)> 0!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM