You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 23:09:01