Java扑克牌手牌评估程序调用changeOne方法报字符串越界异常问题
问题排查结果
直接报错原因:cards 实例变量确实为空,问题出在主类 Assignment4 的输入读取逻辑
你在 case NEW 分支中多调用了一次in.next(),并且没有正确处理Scanner类的换行符残留问题:
case NEW: System.out.println("*** Make New FiveCards ***"); System.out.println("Type five letters without space: "); in.next(); // 多余的调用:直接把用户输入的5个牌面字符读取并丢弃了 cards = in.nextLine().toUpperCase(); // 这里只会读到输入缓冲区残留的换行符,拿到空字符串 myCards.setCards(cards); // 后续代码省略
同时你之前读取用户选项用的是in.next(),该方法只会读取到空白符(空格、换行等)为止,不会消费末尾的换行符,后续调用in.nextLine()时会直接读取到这个残留的换行符,返回空字符串,最终导致操作空字符串抛出索引越界异常。
其他需要修复的严重问题
1. FiveCards.calculateScore() 方法的counter变量未重置
counter是类实例变量,每次调用calculateScore()时都会在上次的基础上累加,完全无法得到正确的得分,需要每次计算前先重置:
public void calculateScore() { counter = 0; // 新增这行重置计数器 for(int i = 0; i<cards.length(); i++) { // 原有循环逻辑 } // 原有得分判断逻辑 }
2. FiveCards.displayData() 方法判断逻辑写反
当前逻辑是牌面长度<=1时返回牌面内容,否则返回Empty,和预期逻辑完全相反,修改为:
public String displayData() { calculateScore(); history = history + cards + score + changes; if(cards != null && cards.length() == 5) { // 修改判断条件 return cards + " " + score + " " + changes; } else { return "Empty" + " " + score + " " + changes; } }
3. changeOne() 方法随机牌生成逻辑错误
生成随机牌时用cards.length()作为随机数乘数,只会从allCards的前5位字符中取值,应该用allCards.length():
// 修改前 randomChar = allCards.charAt((int)(Math.random()*cards.length())); // 修改后 randomChar = allCards.charAt((int)(Math.random()*allCards.length()));
4. 输入读取逻辑统一修复
所有调用in.next()、in.nextInt()的分支后面都需要手动消费残留的换行符,避免后续in.nextLine()读空:
case NEW: System.out.println("*** Make New FiveCards ***"); System.out.println("Type five letters without space: "); in.nextLine(); // 把多余的in.next()改为消费之前读取选项残留的换行符 cards = in.nextLine().toUpperCase(); myCards.setCards(cards); // 后续代码省略 case CHANGE: System.out.println("*** Change One Card ***"); System.out.println("Type one position to change (0-4): "); position = in.nextInt(); in.nextLine(); // 新增这行,消费读取数字残留的换行符 myCards.changeOne(position); // 后续代码省略
内容的提问来源于stack exchange,提问作者GS1221
相关产品推荐
相关产品推荐

