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)
答案 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");