变量已声明初始化仍出现NullPointerException问题求助
Bulls and Cows游戏NullPointerException问题排查与解决
原因分析
从运行日志1234 null可以明确,computerGuess变量为null,直接导致调用countCompBulls方法时传入的Cguess参数为null,触发NullPointerException。
追根溯源到getComputerGuess方法:当attempt == 1时,方法返回getSecretCode()的结果。出现null说明计算机的秘密代码(secret code)未被正确初始化,getSecretCode()返回了null值。也就是说,游戏启动时,EasyAi类没有预先生成自己的随机秘密代码,导致第一次调用getComputerGuess时返回null。
另外,countCompBulls方法内部存在逻辑错误:int ctr = 0; setCompBulls(ctr++);会始终将公牛数设置为0,因为ctr++是后置自增,先返回初始值0再自增,无法实现计数累加。
解决方案
1. 初始化计算机的秘密代码
在EasyAi类的构造方法中,提前生成计算机的秘密代码,确保getSecretCode()能返回有效字符串:
public class EasyAi { private String secretCode; private int codeLength = 4; // 假设代码长度固定为4 public EasyAi() { // 构造方法中初始化计算机秘密代码 this.secretCode = generateUniqueRandomCode(); } public String getSecretCode() { return secretCode; } // 其他已有方法... }
2. 修复getComputerGuess方法的逻辑(可选优化)
确保无论attempt是否为1,都能返回有效代码,同时避免重复生成初始秘密代码:
public String getComputerGuess(int attempt) { if (attempt == 1){ // 此时secretCode已在构造方法初始化,不会返回null return getSecretCode(); } return generateUniqueRandomCode(); }
3. 修复countCompBulls方法的计数逻辑
修正公牛数的累加方式,正确统计匹配的位数:
public void countCompBulls(String Cguess, String UsecretCode) { int bullCount = 0; for (int i = 0; i < getCodeLength(); i++) { if (Cguess.charAt(i) == UsecretCode.charAt(i)) { bullCount++; } } setCompBulls(bullCount); }
4. 增加空值校验(防御性编程)
在countCompBulls和countCompCows方法中添加空值判断,避免后续再次出现类似异常:
public void countCompBulls(String Cguess, String UsecretCode) { if (Cguess == null || UsecretCode == null || Cguess.length() != getCodeLength() || UsecretCode.length() != getCodeLength()) { setCompBulls(0); return; } int bullCount = 0; for (int i = 0; i < getCodeLength(); i++) { if (Cguess.charAt(i) == UsecretCode.charAt(i)) { bullCount++; } } setCompBulls(bullCount); }
内容的提问来源于stack exchange,提问作者Johann
相关产品推荐
相关产品推荐

