我正在尝试学习Java异常处理。我写了以下代码:
import java.util.*;
public class Problem1
{
static Scanner length = new Scanner(System.in);
public static void main(String[] args)
{
double x;
double y;
System.out.println("Input a length in Feet and than Inches.");
x = length.nextDouble();
y = length.nextDouble();
try
{
System.out.println("Feet - Inches:" + x * 12);
System.out.println("Inches - Centimeters:" + y * 2.14);
}
catch (InputMismatchException imeRef)
{
System.out.println("Do not use letters" + imeRef.toString());
}
}
}
该程序只是将英尺和英寸的输入转换为英寸。我尝试通过输入以下内容来打破它:
-1
e
程序中断,但我没有正确捕获和处理异常。我有什么想法吗?
由于
答案 0 :(得分:2)
您需要将读取用户输入的2个输入语句移动到try
块中。只有在读取输入并且在catch中处理该错误时才会抛出该错误,这些语句需要位于try
块中,因为catch只会处理其相应try
块中抛出的异常
try {
x = length.nextDouble(); // moved inside try
y = length.nextDouble(); // moved inside try
System.out.println("Feet - Inches:" + x * 12);
System.out.println("Inches - Centimeters:" + y * 2.14);
}
答案 1 :(得分:1)
放下以下两行 -
x = length.nextDouble();
y = length.nextDouble();
在try
区块内 -
try {
x = length.nextDouble();
y = length.nextDouble();
System.out.println("Feet - Inches:" + x * 12);
System.out.println("Inches - Centimeters:" + y * 2.14);
}
catch (InputMismatchException imeRef) {
System.out.println("Do not use letters" + imeRef.toString());
}
catch
块仅捕获其相应try
块中 语句引发的匹配异常。
答案 2 :(得分:1)
你没有捕获异常是因为在为变量x和y调用length.nextDouble()时抛出了异常。
x = length.nextDouble();
y = length.nextDouble();
但是你没有把它们放在try-catch代码中。将上面的2行代码放到try - catch中,你将捕获异常。
答案 3 :(得分:1)
catch语句只捕获在相应的try块中抛出的异常。
这就是你想要的。这会一次一个地提示用户输入每个问题,然后重置并再次询问输入错误。注意catch中的length.next() - 这是避免无限循环所必需的 - 你必须超越那个坏标记。
while (true) {
try {
System.out.println("Input a length in feet");
double x = length.nextDouble();
System.out.println("Input a length in inches");
double y = length.nextDouble();
System.out.println("Feet - Inches:" + x * 12);
System.out.println("Inches - Centimeters:" + y * 2.14);
break;
}
catch (InputMismatchException imeRef) {
System.out.println("Do not use letters" + imeRef.toString());
// need to purge the bad token
length.next();
}
}