Java递归结合异常处理做double输入校验返回0问题排查
问题成因
你代码的核心问题是catch块中递归调用方法后,没有将递归返回的结果赋值给当前层级的userInputNumber变量,完整执行流程如下:
- 第一次调用方法时,
userInputNumber被初始化为0 - 输入错误触发catch块,你调用了递归方法,第二次调用的方法确实成功拿到了正确的double值,但这个返回值没有被第一次调用的方法接收,第一次调用上下文里的
userInputNumber还是保持初始的0值 - 递归执行完毕回到第一次调用的方法后,方法直接返回了初始值0,因此得不到正确的输入结果
修复方案
方案1:调整递归逻辑,接收递归返回值
直接将catch块内的递归调用结果作为当前方法的返回值即可:
private static double variableNumberInput(String variableName, Scanner userInput) { double userInputNumber = 0; try { System.out.println(String.format("Input value: %s", variableName)); userInputNumber = Double.valueOf(userInput.nextLine()); } catch (Exception exception) { System.out.println("Please try again"); // 直接返回递归调用的结果,不再走当前层级的默认return逻辑 return variableNumberInput(variableName, userInput); } return userInputNumber; }
方案2:改用循环实现(更推荐)
如果用户反复输入错误内容,递归层级过高会触发栈溢出风险,用循环实现重试逻辑更稳妥:
private static double variableNumberInput(String variableName, Scanner userInput) { while (true) { try { System.out.println(String.format("Input value: %s", variableName)); return Double.valueOf(userInput.nextLine()); } catch (Exception exception) { System.out.println("Please try again"); // 输入错误直接进入下一轮循环重试 } } }
内容的提问来源于stack exchange,提问作者M. Kel
相关产品推荐
相关产品推荐

