gpt4 book ai didi

java - Try 和 Catch 循环

转载 作者:行者123 更新时间:2023-12-02 10:37:02 24 4
gpt4 key购买 nike

每当我尝试运行代码时,它都会无限地打印“请输入小时数”,直到给出stackoverflow

public static void hoursToDaysAndHours() throws InterruptedException {
try {
System.out.println("Please enter number of hours");
Calc.fNum = Calc.input.nextDouble();
}
catch (Exception e) {
hoursToDaysAndHours()
}
Calc.sNum = Calc.fNum / 24;
Calc.awnser = Calc.fNum % 24;
System.out.print((int) Calc.fNum + " hours = " + (int) Calc.sNum + " days and " + (int) Calc.awnser + " hours");
Thread.sleep(5000);

Calc.main(null);
}

Calc 是另一个具有 main 并声明变量的类...它位于 hTDAH 类中...

编辑:正如 @Deadpool 在评论中提到的,main 在该部分结束后会重复一次......

3
Please enter a Celious Number
f
Please enter a Celious Number
f
Please enter a Celious Number
f
Please enter a Celious Number
fd
Please enter a Celious Number
d
Please enter a Celious Number
f
Please enter a Celious Number
dddddddddd
Please enter a Celious Number
/
Please enter a Celious Number






87654
87654.0Celcius is 157809.2 in Fahrenheit
Please enter a number between 1-4
1 = AreaOfTriangle
----------------------------------
2 = HoursToDaysAndHours Calculator
----------------------------------
3 = CelciusToFahrenheit Calculator
----------------------------------
4 = BirthdayGame
----------------------------------

Please enter a number between 1-4
1 = AreaOfTriangle
----------------------------------
2 = HoursToDaysAndHours Calculator
----------------------------------
3 = CelciusToFahrenheit Calculator
----------------------------------
4 = BirthdayGame
----------------------------------

最佳答案

首先,不要捕获异常。这样做几乎可以捕获所有可能的异常,包括各种您不应该捕获的事情......因为您没有预料到它们,并且您不知道如何从中恢复。

其次,如果您捕获了意外的异常,您需要以某种方式找出它是什么以及导致它的原因。第一步是打印(或记录)堆栈跟踪。

第三,如果你确实得到了堆栈跟踪,你需要阅读它的内容。或者至少,将其展示给能够阅读其内容的人。 (例如我们!)

那么到底发生了什么?

有很多可能的解释,以下是其中一些:

  1. 如果输入null,则

      Calc.input.nextDouble();

    将抛出一个NullPointerException。如果您捕获该异常并重试(正如您所做的那样),则会循环。

  2. 如果扫描仪输入流中的下一个标记不是有效的 double 型,则 nextDouble() 将抛出 InputMismatchException 而不会前进到超过 token 。如果你捕获并重试,你只会得到相同的异常......并且你会循环。

  3. 这里可能会发生其他异常并给出相同的结果;例如NoSuchElementExceptionIllegalStateException

  4. 另一种情况是,您可能会因为

      Calc.main(null);

    在方法末尾调用。这很可能会再次调用您的 Calc 类入口点...导致您循环。

现在,堆栈溢出的堆栈跟踪应该允许您区分其中的一些,并且将 e.printStacktrace() 添加到处理程序将提供更多信息。

挑战:尝试这样做/阅读堆栈跟踪,看看您是否可以自己解决!

<小时/>

... so my understanding is that i have to cast input to a double

没有。 input 变量可能是一个 Scanner。您无法将 Scanner 转换为 double 。

根据我上面所说的,我/我们(还)无法告诉您需要做什么来解决这个问题。但第一步是打印堆栈跟踪并读取它!

<小时/>

But what does Double.parseDouble(Calc.input.next()) do that Calc.input.nextDouble() cannot do.

它们使用不同的语法规则:

  • Scanner 根据取决于当前区域设置的语法来解析数字;请参阅javadoc .
  • Double.parseDouble 根据区域设置不敏感的语法解析数字;请参阅javadoc .

这足以使字符串在一种情况下有效,而在另一种情况下无效。这取决于您尝试解析的字符串...以及您的区域设置。

关于java - Try 和 Catch 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53200770/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com