Java井字棋输入X崩溃问题求助:需支持输入0和X正常游玩
解决输入非整数(如X)时程序崩溃的问题
嘿,我来帮你搞定这个问题!首先咱们得搞清楚为啥输入X会崩:你的代码里用scan.nextInt()来读取输入,但nextInt()只能解析整数,当用户输入X这种字符串时,它会直接抛出InputMismatchException,而你当前的try-catch只抓了IllegalArgumentException,这个异常没被处理,程序自然就崩溃了。而且就算你抓了这个异常,Scanner的缓冲区里还留着那个无效的X,不清理的话下一次读取还是会读到它,陷入死循环。
下面是具体的修复方案,我给你改好了代码,还标注了关键修改点:
修改后的完整main方法代码
public static void main(String[] args) { createBoard(3,3); int turn = 0; int playerVal; int outcome; java.util.Scanner scan = new java.util.Scanner(System.in); do { displayBoard(); playerVal = (turn % 2 == 0)? NOUGHT : CROSS; if (playerVal == NOUGHT) { System.out.println ("\n-0's turn-"); } else { System.out.println("\n-X's turn-"); } System.out.print("Enter row and Column:"); try { // 先检查输入是否是整数,避免直接解析出错 if (!scan.hasNextInt()) { // 读取无效输入并丢弃,同时抛出明确的错误提示 String badInput = scan.next(); throw new IllegalArgumentException("输入无效:" + badInput + ",请输入整数格式的行号和列号"); } int row = scan.nextInt(); if (!scan.hasNextInt()) { String badInput = scan.next(); throw new IllegalArgumentException("列号输入无效:" + badInput + ",请输入整数"); } int col = scan.nextInt(); // 若你的set方法是用单个位置值(比如1-9对应棋盘格子),改成读取一个整数即可 // 示例:int position = scan.nextInt(); set(playerVal, position); set(playerVal, row, col); // 根据你的实际set方法调整参数 } catch (java.util.InputMismatchException | IllegalArgumentException ex) { System.err.println(ex.getMessage()); // 清除缓冲区里剩余的无效内容,防止死循环 scan.nextLine(); } turn ++; outcome = winOrTie(); } while ( outcome == -2 ); displayBoard(); switch (outcome) { case NOUGHT: System.out.println("0 wins!"); break; case CROSS: System.out.println("X wins!"); break; case 0: System.out.println("Tie."); break; } }
关键修改点解释
- 扩展异常捕获:把
InputMismatchException加入catch块,专门处理非整数输入的情况,和原有的IllegalArgumentException一起处理 - 提前检查输入有效性:用
scan.hasNextInt()先判断下一个输入是否是整数,避免直接调用nextInt()抛出异常,还能给出更明确的错误提示 - 清理缓冲区:遇到无效输入时,用
scan.nextLine()清空缓冲区里剩下的内容,不然下次读取还会读到同样的无效内容,导致程序一直报错循环 - 更友好的错误提示:告诉用户具体哪里错了,比如是输入了X这种无效内容,还是列号没输入对
如果你的set方法原本是用单个数字表示棋盘位置(比如1-9对应3x3格子),只需要把读取逻辑改成读一个整数就行,核心的异常处理逻辑完全通用。
这样修改后,不管用户输入X还是其他非整数内容,程序都不会崩溃,而是会给出清晰的错误提示,让用户重新输入,完美解决你的问题!
内容的提问来源于stack exchange,提问作者joseig
相关产品推荐
相关产品推荐

