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

Java战斗方法击败所有敌人后报错,求技术解决方案

Java战斗方法敌人全灭后触发错误的解决方案

问题根源

当最后一个敌人被击败后,enemyList变为空,但后续角色的回合仍会继续执行——此时代码中所有访问enemyList.get(0)的逻辑都会抛出IndexOutOfBoundsException(数组越界异常),比如你报错的这行:

dmg = (skill[i][0] * charList.get(i).getSTR()) / enemyList.get(0).getDEF();

触发场景:多个角色轮流行动时,某角色击败最后一个敌人后,剩余角色仍会进入行动流程,尝试访问已空的敌人列表。

解决方案

1. 提前终止无效的角色回合

在每个角色行动前,先检查敌人列表是否为空,若为空则直接跳出角色回合循环,结束战斗:

while(!enemyList.isEmpty()){
    for(int i = 0; i < charList.size(); i++){
        // 新增:敌人全灭时,跳过剩余角色回合
        if(enemyList.isEmpty()) {
            break;
        }
        
        if(HPnMP[i][0] <= 0) {
            System.out.println(name[i] + " has been defeated!");
            continue;
        }
        
        // 原有角色状态展示、行动选择逻辑...
    }
    // 敌人回合逻辑...
}

2. 给攻击/技能逻辑加保险

在所有访问enemyList.get(0)的代码块前,额外增加非空判断,避免异常:

基础攻击分支(case 1)

case 1:
    if(enemyList.isEmpty()) {
        System.out.println("所有敌人已被击败,无需攻击!");
        break;
    }
    dmg = charList.get(i).getSTR() - enemyList.get(0).getDEF();
    EnemyHP = enemyList.get(0).getHP() - dmg;
    // 后续伤害处理逻辑...

技能分支(case 2)

case 2:
    System.out.println("Select skill:");
    System.out.println("1. " + skillname[i][0]);
    System.out.println("2. " + skillname[i][1]);
    int choice = scanN.nextInt();
    if(choice == 1){
        double MP = HPnMP[i][1] - MPCost[i][0];
        
        if(MP >= 0){
            HPnMP[i][1] = MP;
            
            if(enemyList.isEmpty()) {
                System.out.println("所有敌人已被击败,无需使用技能!");
                break;
            }
            
            dmg = (skill[i][0] * charList.get(i).getSTR()) / enemyList.get(0).getDEF();
            // 后续技能伤害处理逻辑...
        } else {
            System.out.println(name[i] + " ran out of mana to use their skill.");
        }
    } else {
        double MP = HPnMP[i][1] - MPCost[i][1];
        
        if(MP >= 0){
            HPnMP[i][1] = MP;
            
            if(enemyList.isEmpty()) {
                System.out.println("所有敌人已被击败,无需使用技能!");
                break;
            }
            
            dmg = (skill[i][1] * charList.get(i).getSTR()) / enemyList.get(0).getDEF();
            // 后续技能伤害处理逻辑...
        } else {
            System.out.println(name[i] + " ran out of mana to use their skill.");
        }
    }

额外优化建议

目前代码固定攻击索引为0的敌人,可考虑改为随机选择存活敌人,让战斗逻辑更合理:

// 替换原有enemyList.get(0)的逻辑
Random random = new Random();
int targetIndex = random.nextInt(enemyList.size());
Enemies targetEnemy = enemyList.get(targetIndex);
// 用targetEnemy替代enemyList.get(0)进行伤害计算

内容的提问来源于stack exchange,提问作者Idiot User

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 10:30:00