我想让用户输入两个代表三角形边的双打,然后计算斜边。首先,用户指定他们想要的命令(A,B,C或Q),然后对于A和B(侧输入),他们被要求输入双。现在,当他们没有输入双精度时,程序会要求他们输入第一个输入(A,B,C,Q)。我希望程序只要求输入另一个双精度,直到输入有效。
我的代码如下:
import java.util.InputMismatchException;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Double sideA = null;
Double sideB = null;
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.println("Enter command: ");
String command = scanner.nextLine();
try { // checks command, throws exception if not A, B, C or Q
if (command.equals("A")) {
System.out.println("Enter a value for side A:");
sideA = scanner.nextDouble(); // throws InputMismatchException if not a double
scanner.nextLine();
try {
if (sideA < 0 || sideA == 0.0) {
throw new InputMismatchException();
}
} catch (InputMismatchException e) {
System.out.println("Value is invalid. Must be positve and a double.");
}
}
else if (command.equals("B")) {
System.out.println("Enter a value for side B:");
sideB = scanner.nextDouble(); // throws InputMismatchException if not a double
scanner.nextLine();
try {
if (sideB < 0 || sideB == 0.0) {
throw new InputMismatchException();
}
} catch (InputMismatchException e) {
System.out.println("Value is invalid. Must be positive and a double.");
}
}
else if (command.equals("C")) {
Triangle calculate = new Triangle(sideA, sideB);
System.out.println(calculate.calcHypotenuse());
break;
}
else if (command.equals("Q")) {
System.exit(0);
}
else {
throw new IllegalArgumentException();
}
}
catch (IllegalArgumentException e) {
System.out.println("Command is invalid, Enter A, B, C, or Q.");
}
catch (InputMismatchException e) {
System.out.println("Value is invalid. Must be positve and a double.");
scanner.nextLine();
}
}
}
}
答案 0 :(得分:0)
快速查看代码,只需在while循环外移动命令字符串即可实现所需内容
String command = null;
while (true) {
if (command == null) {
System.out.println("Enter command: ");
command = scanner.nextLine();
}
....
}
另外,请考虑合并try-catch
代码,以免您重复代码
答案 1 :(得分:0)
使用嵌套的while循环来获得所需的double值:
private Scanner scanner = new Scanner(System.in);
private double getDoubleInput() {
double ret = -1;
while (ret < 0) {
try {
ret = scanner.nextDouble();
}catch (InputMismatchException e) {
System.out.print("Enter a valid double value: ");
}
}
return ret;
}
通过提示用户输入有效的double值直到输入正双精度来处理NaN和负数。确保将Scanner变为类变量,以便此方法可以访问它。
答案 2 :(得分:0)
好的,首先也是最好的,请妥善缩进并提供足够的评论来解释您的思考过程。
其次,还有一些事情尚不清楚。
try { // checks command, throws exception if not A, B, C or Q
if (command.equals("A")) {
System.out.println("Enter a value for side A:");
sideA = scanner.nextDouble(); // throws InputMismatchException if not a double
scanner.nextLine();
在上面提到的代码中,在最后一行中,你有一个来自Scanner类对象的输入,它没有存储到任何东西中。
你为什么需要它?它的目的是什么?
第三,代码中存在大量代码重复,IF-ELSE-IF
的数量。使用 SWITCH 尝试相同的代码,如果你使用 SWITCH 而不是 IF-ELSE ,这就是你可以避免的问题。
您仍然将提示设置为enter a command
的原因是因为您已将其置于while循环中。将其从那个地方移除并将其替换到外面就可以了。
这让我想到了最后一点,一旦你得到你需要的东西即 正确答案或例外的无效输入,那么为什么你需要一次又一次地检查同一个语句吗?
while(true){
......
......
......
}
将无限运行,并一遍又一遍地检查相同的条件,给出与输出无限次相同的异常。
要解决此问题,请删除while loop
或从用户那里获取其他输入,直到他输入所需的值,然后在达到所需的输出后break
。