TableService类setNextPlayerCurrent方法测试异常排查
问题
在TableService类中实现了切换当前玩家的setNextPlayerCurrent方法,但调用该方法时抛出java.util.NoSuchElementException: No value present异常。
TableService类相关代码
private ArrayList<Player> players = new ArrayList<>(); private Optional<Player> currentPlayer = Optional.empty(); public void setNextPlayerCurrent() { int currentPlayerIndex = players.indexOf(currentPlayer.get()); if (!lastPlayerCheck(currentPlayerIndex)) { currentPlayer = Optional.of(players.get(currentPlayerIndex + 1)); } else { currentPlayer = Optional.of(players.get(0)); } } public boolean lastPlayerCheck(int currentPlayerIndex) { if (currentPlayerIndex == (players.size() - 1)) { return true; } return false; }
测试代码
@Test void checkCurrentPlayerSetting() { List<Player> players = tableService.getPlayers(); Optional<Player> currentPlayer = tableService.getCurrentPlayer(); Player player1 = new Player("A", "Adam", 100); Player player2 = new Player("B", "Bella", 100); players.add(player1); players.add(player2); currentPlayer = Optional.of(players.get(0)); int player1Index = players.indexOf(player1); int player2Index = players.indexOf(player2); System.out.println(player1Index); // 输出0 System.out.println(player2Index); // 输出1 System.out.println(players.indexOf(currentPlayer.get())); // 输出0 tableService.setNextPlayerCurrent(); // 抛出异常 //assertEquals(player2.getId(), currentPlayer.get().getId()); }
解决方案
问题根源
测试代码中仅对**局部变量currentPlayer**赋值,并未修改TableService类内部的成员变量currentPlayer。调用setNextPlayerCurrent时,类内的currentPlayer仍为初始的Optional.empty(),执行currentPlayer.get()自然触发空值异常。
修复步骤
给
TableService添加设置当前玩家的方法
在TableService类中新增方法,用于修改内部的currentPlayer成员变量:public void setCurrentPlayer(Optional<Player> currentPlayer) { this.currentPlayer = currentPlayer; }修改测试代码,正确设置类内的当前玩家
将测试中给局部变量赋值的逻辑,替换为调用新增的setCurrentPlayer方法:@Test void checkCurrentPlayerSetting() { List<Player> players = tableService.getPlayers(); Player player1 = new Player("A", "Adam", 100); Player player2 = new Player("B", "Bella", 100); players.add(player1); players.add(player2); // 调用新增方法,设置TableService内部的currentPlayer tableService.setCurrentPlayer(Optional.of(players.get(0))); int player1Index = players.indexOf(player1); int player2Index = players.indexOf(player2); System.out.println(player1Index); // 输出0 System.out.println(player2Index); // 输出1 System.out.println(players.indexOf(tableService.getCurrentPlayer().get())); // 输出0 tableService.setNextPlayerCurrent(); // 不再抛出异常 assertEquals(player2.getId(), tableService.getCurrentPlayer().get().getId()); }额外优化(可选)
为避免后续出现同类问题,可在setNextPlayerCurrent方法中先判断currentPlayer是否有值:public void setNextPlayerCurrent() { if (currentPlayer.isEmpty()) { // 可抛出自定义异常或设置默认玩家,根据业务需求处理 throw new IllegalStateException("当前玩家未初始化"); } int currentPlayerIndex = players.indexOf(currentPlayer.get()); if (!lastPlayerCheck(currentPlayerIndex)) { currentPlayer = Optional.of(players.get(currentPlayerIndex + 1)); } else { currentPlayer = Optional.of(players.get(0)); } }
内容的提问来源于stack exchange,提问作者djasyfuj
相关产品推荐
相关产品推荐

