无论怎样,我的计划都会增加价值

时间:2014-02-11 21:35:37

标签: java swing exception-handling

我正在制作数学练习应用程序。这是循环10个随机问题,并有计数器,显示你有多少权利和你有多少错误。

我尝试进行一些异常处理,以便在没有输入值时弹出窗口。当弹出窗口出现时,错误答案计数器或正确答案计数器的计数器无论如何都会递增。

这是代码:

import javax.swing.*;

import java.awt.*;
import java.awt.event.*;



@SuppressWarnings("serial")
public class MathPractice extends JFrame {
    Container c;
    JPanel output;
    JLabel title, num1, num2, lbloperator, equals, mark, display, correct, wrong ,correctN, wrongN;
    JTextField answer;
    JButton newB, ansB;
    JTextArea txtdisplay;

    String operator;

    int number1;int number2;int rightNum = 0;int wrongNum = 0;int result;int random;int randomOperator; int cnt = 1;

    public int getRandom(){
        int random = (int)(Math.random() * 10 + 1);
        return random;
    }
    public String getRandomOperator(){
        int randomOperator = (int)(Math.random() * 4 + 1);
        if(randomOperator == 1)
            return "+";
        else if (randomOperator == 2)
            return "-";
        else if (randomOperator == 3)
            return "*";
        else {
            return "/";
        }       
    }

    class ExcerciseHandler implements ActionListener {
        public void actionPerformed(ActionEvent e) {
                number1 = getRandom();
                number2 = getRandom();

                num1.setText(""+number1);
                num2.setText(""+number2);

                operator = getRandomOperator();

                lbloperator.setText(operator);

                rightNum = 0;
                wrongNum = 0;
                cnt = 1;

                correctN.setText("" + rightNum);
                wrongN.setText("" + wrongNum);
                display.setText("");

                answer.setText("");
            }
        }



    class AnswerHandler implements ActionListener {
        public void actionPerformed(ActionEvent e) {            
                    boolean canRun = true;
                    double input = 0;
                    try{
                    input = Double.parseDouble(answer.getText());               
                    }
                    catch (Exception ex){
                        canRun = false;
                        JOptionPane.showMessageDialog(null, "Please enter a valid number!");
                        answer.requestFocus();
                        answer.selectAll();
                    }
                    operator = lbloperator.getText();   

                if(cnt <= 10){
                    if (operator.equals("+")){
                        result = number1 + number2;
                        if(input == result){
                            rightNum++;
                            correctN.setText(""+rightNum);
                        }
                        else {
                            wrongNum++;
                            wrongN.setText(""+wrongNum);
                        }
                    }
                    else if (operator.equals("-")){
                        result = number1 - number2;
                        if(input == result){
                            rightNum++;
                            correctN.setText(""+rightNum);
                        }
                        else {
                            wrongNum++;
                            wrongN.setText(""+wrongNum);
                        }

                    }
                    else if (operator.equals("*")){
                        result = number1 * number2;
                        if(input == result){
                            rightNum++;
                            correctN.setText(""+rightNum);
                        }
                        else {
                            wrongNum++;
                            wrongN.setText(""+wrongNum);
                        }
                    }
                    else {
                        result = number1 / number2;
                        if(input == result){
                            rightNum++;
                            correctN.setText(""+rightNum);
                        }
                        else {
                            wrongNum++;
                            wrongN.setText(""+wrongNum);
                        }                   
                    }
                    number1 = getRandom();
                    number2 = getRandom();

                    num1.setText(""+number1);
                    num2.setText(""+number2);

                    lbloperator.setText("" + getRandomOperator());

                    answer.setText("");
                    answer.requestFocus();

                    cnt++;  


                }
                if (cnt == 11 && rightNum > 6){
                    display.setText("Keep up the good work!");
                }
                else if (cnt == 11 && rightNum <= 6){
                    display.setText("Better luck next time!");
                }
            }
    }



    Font f = new Font("Arial", Font.BOLD, 20);
    Font numbers = new Font("Arial", Font.PLAIN, 30);
    Font operators = new Font("Arial", Font.PLAIN, 20);
    Font outputF = new Font("Arial", Font.ITALIC, 15);
    Font fAnswers = new Font("Arial", Font.BOLD, 30);



    MathPractice (){
        super("Math Practice");
        c = getContentPane();
        c.setLayout(null);
        //c.setBackground(Color.blue);

        title = new JLabel("How Much is: ");
        title.setSize(150,20);
        title.setLocation(130, 5);
        title.setFont(f);
        title.setForeground(Color.red);

        number1 = getRandom();
        num1 = new JLabel(""+ number1);
        num1.setSize(40, 40);
        num1.setLocation(30, 35);
        num1.setFont(numbers);

        lbloperator = new JLabel(getRandomOperator());
        lbloperator.setSize(40, 40);
        lbloperator.setLocation(85, 37);
        lbloperator.setFont(operators);

        number2 = getRandom();
        num2 = new JLabel(""+ number2);
        num2.setSize(40, 40);
        num2.setLocation(140, 35);
        num2.setFont(numbers);      

        equals = new JLabel(" = ");
        equals.setSize(40, 40);
        equals.setLocation(200, 35);
        equals.setFont(numbers);

        answer = new JTextField(8);
        answer.setSize(80, 40);
        answer.setLocation(250, 35);
        answer.setFont(numbers);        

        mark = new JLabel("?");
        mark.setSize(40, 40);
        mark.setLocation(350, 35);
        mark.setFont(numbers);

        display = new JLabel("");
        display.setSize(350, 40);
        display.setLocation(30, 90);
        display.setFont(numbers);
        //display.setVisible(false);



        newB = new JButton("    New Excercise    ");
        newB.setSize(170, 40);
        newB.setLocation(15, 170);
        ExcerciseHandler eh = new ExcerciseHandler();
        newB.addActionListener(eh);

        ansB = new JButton("    Answer    ");
        ansB.setSize(170, 40);
        ansB.setLocation(195,170);
        AnswerHandler ah = new AnswerHandler();
        ansB.addActionListener(ah);

        output = new JPanel();
        output.setLayout(null);
        output.setSize(375, 225);
        output.setBorder(BorderFactory.createTitledBorder("Statistic: "));
        output.setLocation(5, 225);

        correct = new JLabel("<html> Number of Correct\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Answers: " );
        correct.setSize(150, 50);
        correct.setLocation(15, 25);
        correct.setFont(outputF);

        wrong = new JLabel("<html> Number of Wrong\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Answers: ");
        wrong.setSize(150, 50);
        wrong.setLocation(230, 25);
        wrong.setFont(outputF);

        correctN = new JLabel("" + rightNum);
        correctN.setSize(100, 100);
        correctN.setLocation(60, 50);
        correctN.setFont(fAnswers);
        correctN.setForeground(Color.green);

        wrongN = new JLabel("" + wrongNum);
        wrongN.setSize(100, 100);
        wrongN.setLocation(275, 50);
        wrongN.setFont(fAnswers);
        wrongN.setForeground(Color.red);    

        c.add(title);c.add(num1);c.add(lbloperator);c.add(num2);c.add(equals);c.add(answer);c.add(mark);c.add(display);c.add(newB);
        c.add(ansB);c.add(output);

        output.add(correct);output.add(wrong);output.add(correctN);output.add(wrongN);  
    }

    public static void main(String[] args) {
        MathPractice app = new MathPractice();
        app.setSize(400, 500);
        app.setVisible(true);
        app.setDefaultCloseOperation(DISPOSE_ON_CLOSE);

    }

}

2 个答案:

答案 0 :(得分:3)

在catch块的底部放置一个return;语句。这将导致代码在发生异常时处理异常后离开处理程序。

try{
   input = Double.parseDouble(answer.getText());               
}
catch (NumberFormatException ex){
   canRun = false;
   JOptionPane.showMessageDialog(null, "Please enter a valid number!");
   answer.requestFocus();
   answer.selectAll();

   return; // ****** added *****
}

顺便说一句:您应该避免捕获Exception,而应该只捕获特定的例外,NumberFormatException

答案 1 :(得分:0)

显示错误弹出窗口后,该方法继续执行,从而增加计数器。如果输入了错误的值,则结束方法,或循环直到输入正确的值。