Java迷宫程序异常求助:合法输入被错误捕获的问题解决
问题分析与解决方案
你的程序出现合法输入触发错误提示的核心问题是没有正确跟踪玩家的当前位置,同时存在异常滥用和移动逻辑漏洞,具体问题和修复方案如下:
核心问题
- 硬编码玩家初始位置:每次处理移动时,你都将
playerRowPosition和playerColPosition重置为初始的9和8,导致程序永远只检查从初始位置出发的移动是否合法,而非玩家实际所在位置。 - 未清理旧玩家位置:即使移动成功,也没有将原位置改为空白,导致迷宫中出现多个玩家标记,且无法正确识别当前位置。
- 滥用异常处理:用
NumberFormatException处理非法移动属于错误用法,异常应用于意外错误,而非业务逻辑判断。
修复步骤
1. 正确跟踪玩家位置
将玩家初始位置的初始化移到外层循环外,确保每次移动都基于当前位置判断:
Scanner myInput = new Scanner(System.in); String tempInput; char playerMove; // 初始化玩家初始位置,放在外层循环外 int playerRowPosition = 9; int playerColPosition = 8;
2. 重构输入验证逻辑
去掉不必要的try-catch,用直接的逻辑判断验证输入,代码更清晰:
while (true) { System.out.println("\nWhat direction would you like to move (Controls: w - a - s - d): "); tempInput = myInput.nextLine().trim(); if (tempInput.length() != 1) { System.out.println("\nPlease provide a single character move."); continue; } playerMove = tempInput.toUpperCase().charAt(0); if (playerMove == 'W' || playerMove == 'A' || playerMove == 'S' || playerMove == 'D') { break; } else { System.out.println("\nPlease provide a valid move: w, a, s or d."); } }
3. 修复移动逻辑
修改移动判断,加入边界检查,清理旧位置并更新当前位置,去掉异常抛出:
// 移除原来的try-catch,用逻辑判断处理移动 boolean moveValid = false; if (playerMove == 'W') { int newRow = playerRowPosition - 1; // 检查边界和是否为可行路径 if (newRow >= 0 && mapOfMaze[newRow][playerColPosition].equals(" ")) { mapOfMaze[playerRowPosition][playerColPosition] = " "; // 清理旧位置 playerRowPosition = newRow; mapOfMaze[playerRowPosition][playerColPosition] = " * "; // 设置新位置 moveValid = true; } } else if (playerMove == 'A') { int newCol = playerColPosition - 1; if (newCol >= 0 && mapOfMaze[playerRowPosition][newCol].equals(" ")) { mapOfMaze[playerRowPosition][playerColPosition] = " "; playerColPosition = newCol; mapOfMaze[playerRowPosition][playerColPosition] = " * "; moveValid = true; } } else if (playerMove == 'S') { int newRow = playerRowPosition + 1; if (newRow < mapOfMaze.length && mapOfMaze[newRow][playerColPosition].equals(" ")) { mapOfMaze[playerRowPosition][playerColPosition] = " "; playerRowPosition = newRow; mapOfMaze[playerRowPosition][playerColPosition] = " * "; moveValid = true; } } else if (playerMove == 'D') { int newCol = playerColPosition + 1; if (newCol < mapOfMaze[playerRowPosition].length && mapOfMaze[playerRowPosition][newCol].equals(" ")) { mapOfMaze[playerRowPosition][playerColPosition] = " "; playerColPosition = newCol; mapOfMaze[playerRowPosition][playerColPosition] = " * "; moveValid = true; } } // 移动不合法时提示 if (!moveValid) { System.out.println("\nThat move is not possible, the player is not able to move on walls or out of the maze."); }
4. 终点判断修正
确保终点判断正确,当玩家移动到终点E的位置时,循环结束:
// 外层循环条件改为检查玩家是否到达终点 while (!mapOfMaze[playerRowPosition][playerColPosition].equals(" E ")) { // 打印迷宫的代码保持不变 // ... } // 循环结束后提示通关 System.out.println("Congratulations! You reached the end!");
关键说明
- 加入边界检查可以避免数组越界错误(比如玩家试图移动到迷宫外)。
- 清理旧位置确保迷宫中始终只有一个玩家标记。
- 用逻辑判断替代异常处理,代码可读性和维护性更强。
内容的提问来源于stack exchange,提问作者Joel Alex
相关产品推荐
相关产品推荐

