我的java代码一直给我例外。当我输入单词stop时,如何防止此异常?

时间:2014-11-17 18:29:21

标签: java

import java.util.*;

import java.io.*;

public class BoxOfficeImproved {

    public static void main(String[] args) throws IOException {

            Scanner stdin = new Scanner(System.in);
            String inData;
            int age;
            for (;;) {
            System.out.println("Enter your age:");
            inData = stdin.nextLine();
            age = Integer.parseInt(inData); // convert inData to int

            if (inData.equalsIgnoreCase("Stop")) {
                System.exit(1);
            } else {

                if (age <= 17) {
                    System.out.println("Child Rate");

                    if (age < 5) {
                        System.out.println("30 Percent discount from child rate");

                    }
                } else if (age > 70) {

                    System.out.println("25 Percent discount from Adult Rate");
                } else {
                    System.out.println("Adult rate");
                }

                System.out.println("Enjoy the show"); // always executed


        }
    }
}

}

错误

Exception in thread "main" java.lang.NumberFormatException: For input string: "stop"
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    at java.lang.Integer.parseInt(Integer.java:580)
    at java.lang.Integer.parseInt(Integer.java:615)
    at BoxOfficeImproved.main(BoxOfficeImproved.java:14)
Java Result: 1
BUILD SUCCESSFUL (total time: 4 seconds)

4 个答案:

答案 0 :(得分:2)

在您确定输入数字之前,不要将年龄解析为int。

丑陋的代码;难以阅读。学习Sun Java编码标准,并为支架放置开发严格,一致的风格。 IDE可以帮助解决这个问题。

import java.util.*;

import java.io.*;

public class BoxOfficeImproved {

public static void main(String[] args) throws IOException {

        Scanner stdin = new Scanner(System.in);
        String inData;
        int age;
        for (;;) {
        System.out.println("Enter your age:");
        inData = stdin.nextLine();

        if (inData.equalsIgnoreCase("Stop")) {
            System.exit(1);
        } else {
            age = Integer.parseInt(inData); // convert inData to int
            if (age <= 17) {
                System.out.println("Child Rate");

                if (age < 5) {
                    System.out.println("30 Percent discount from child rate");

                }
            } else if (age > 70) {

                System.out.println("25 Percent discount from Adult Rate");
            } else {
                System.out.println("Adult rate");
            }

            System.out.println("Enjoy the show"); // always executed


    }
}
}

}

这是关于如何编写它的另一个想法。我认为它更具可扩展性和更简洁:

/**
 * A better box office
 * User: mduffy
 * Date: 11/17/2014
 * Time: 1:47 PM
 * @link http://stackoverflow.com/questions/26979396/my-java-code-keep-giving-me-exceptions-how-do-i-prevent-this-exception-when-i-t/26979452#26979452
 */

import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Scanner;

public class BoxOfficeImproved {

    private static Map<Integer, String> OUTCOMES;

    static {
        OUTCOMES = new LinkedHashMap<Integer, String>() {{
            put(5, "30 Percent discount from child rate");
            put(17, "Child Rate");
            put(71, "Adult rate");
            put(1000, "25 Percent discount from Adult Rate");
        }};
    }

    public static void main(String[] args) throws IOException {

        Scanner stdin = new Scanner(System.in);
        String inData;
        int age;
        do {
            System.out.print("Enter your age:");
            inData = stdin.nextLine();
            try {
                age = Integer.parseInt(inData);
                System.out.println(getOutcome(age));
                System.out.println("Enjoy the show"); // always executed
            } catch (NumberFormatException e) {
                System.out.println(String.format("'%s' is not a valid age; try again", inData));
            }
        } while (!"stop".equalsIgnoreCase(inData));
    }

    public static String getOutcome(int age) {
        for (int minAge : OUTCOMES.keySet()) {
            if (age < minAge) {
                return OUTCOMES.get(minAge);
            }
        }
        return String.format("No outcome found for age %d", age);
    }
}

答案 1 :(得分:1)

您正在尝试将inData解析为整数,然后再检查它是否为“停止”一词。尝试将“Stop”解析为整数会引发异常。尝试在检查后解析

inData = stdin.nextLine();
if (inData.equalsIgnoreCase("Stop")) {
    System.exit(1);
} else {
    age = Integer.parseInt(inData);
    ...

答案 2 :(得分:1)

您将输入的字符串转换为int ,然后检查它是不是“停止”这个词 - 这应该只在您决定不想要的时候完成停止:

inData = stdin.nextLine();
if (inData.equalsIgnoreCase("Stop")) {
    System.exit(1);
} else {
    age = Integer.parseInt(inData); // convert inData to int
    // rest of the code to handle age

答案 3 :(得分:0)

在您的else块中移动解析语句(Integer.parseInt(inData))。

if (inData.equalsIgnoreCase("Stop")) {
                System.exit(1);
            } else {
        age = Integer.parseInt(inData); 
        System.out.println("Child Rate");