Java使用Scanner接收1个或2个输入的实现问题咨询
问题根因
Scanner.hasNext() 为阻塞方法,当绑定控制台输入流System.in时,只有收到输入结束信号(Windows下为Ctrl+Z,Linux/macOS下为Ctrl+D)才会返回false,用户输入单个数字后按回车不属于输入结束信号,因此方法会持续挂起等待后续输入,不会触发单数字处理逻辑。
修复方案
推荐先读取用户输入的整行内容(用户按下回车即代表本次输入结束),再拆分解析数字,修改后代码如下:
private static void promptRequest() { System.out.print("Enter a request: "); Scanner sc = new Scanner(System.in); // 读取完整一行输入,按下回车直接结束本次输入采集 String inputLine = sc.nextLine(); // 按任意空白符拆分输入内容 String[] inputParts = inputLine.trim().split("\\s+"); long firstNumber, secondNumber; // 校验第一个输入数字 try { firstNumber = Long.parseLong(inputParts[0]); } catch (NumberFormatException | ArrayIndexOutOfBoundsException e) { System.out.println("First number is not a valid number"); promptRequest(); return; } // 判断是否存在第二个输入 if (inputParts.length >= 2) { try { secondNumber = Long.parseLong(inputParts[1]); } catch (NumberFormatException e) { System.out.println("Second number is not a valid number"); promptRequest(); return; } processTwoNumbers(firstNumber, secondNumber); } else { processOneNumber(firstNumber); } }
补充说明
原代码中使用递归调用promptRequest()处理输入错误的逻辑,在用户连续多次输入错误时存在栈溢出风险,可替换为while循环实现重试逻辑,稳定性更高。
内容的提问来源于stack exchange,提问作者Ofentse Nglazi
相关产品推荐
相关产品推荐

