Java中如何解决终端程序选择继续后异常停止的问题
问题原因分析
你遇到的问题确实和if分支缺少后续逻辑有关,拆解当前doMore()方法的执行顺序后就能明白程序停止的原因:
现有代码执行顺序
- 进入
doMore()方法后,首先打印是否继续操作的提示 - 调用
keyboard.nextLine()读取用户输入的回答 - 对回答做分支判断:
- 如果回答是yes相关取值:执行
showInstructions()方法,该方法执行完成后,if分支没有其他代码,整个doMore()方法执行结束,返回到调用doMore()的上级代码位置 - 如果回答是no相关取值:打印退出提示后调用
System.exit(0),直接终止整个Java进程
- 如果回答是yes相关取值:执行
你预期选yes后重复之前的提问流程,但现有代码在if分支执行完showInstructions()后,没有触发重新执行提问流程的逻辑,如果调用doMore()的外层代码也没有循环重新走提问流程,整个程序没有后续需要执行的代码,自然就会终止运行。
优化建议
- 简化判断逻辑:可以用
String.equalsIgnoreCase()方法忽略大小写匹配,不用写多段或判断,示例:
if(answer.equalsIgnoreCase("yes") || answer.equalsIgnoreCase("y"))
- 新增循环逻辑控制流程:可以在外层加循环控制整个业务的执行,调整
doMore()方法返回布尔值告知外层是否继续运行,示例代码如下:
// 主流程循环控制 public void runMainProcess() { boolean needContinue = true; while (needContinue) { // 这里替换为你原本的一系列提问逻辑 askAllQuestions(); // 调用doMore获取是否继续的标记 needContinue = doMore(); } } // 调整返回值为布尔类型的doMore方法 boolean doMore(){ System.out.print("Do you want to do anything else? : Yes|No "); String answer = keyboard.nextLine(); if(answer.equalsIgnoreCase("YES") || answer.equalsIgnoreCase("Y")){ showInstructions(); return true; // 告知外层继续循环执行提问流程 }else{ System.out.println("Thank you for using the lego manager. Please come back soon!"); System.exit(0); } }
内容的提问来源于stack exchange,提问作者icekomo
相关产品推荐
相关产品推荐

