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

Java实现移除数组首元素时遇空数组引发NegativeArraySizeException问题

问题分析与解决

你的代码抛出NegativeArraySizeException的核心原因很直接:你在方法开头就创建了newHand数组,当传入的remainingDeck是空数组时,remainingDeck.length - 1等于-1,Java不允许创建长度为负数的数组,直接触发异常。不管后续的判断逻辑怎么写,只要这行创建数组的代码在判断空数组之前执行,就会先触发错误,根本走不到后面的return逻辑。

修正后的代码(手动实现)

把数组创建的逻辑移到空数组判断之后,确保只有当原数组长度大于1时才创建新数组:

public String[] discardTopCard(String[] remainingDeck) {
    // 先处理空数组的情况,直接返回空数组
    if (remainingDeck.length == 0) {
        return new String[]{};
    }
    // 数组长度为1时,弃掉唯一元素后返回空数组
    if (remainingDeck.length == 1) {
        return new String[]{};
    }
    // 只有长度>1时才创建新数组,避免负数长度问题
    String[] newHand = new String[remainingDeck.length - 1];
    int k = 0;
    for (int i = 1; i < remainingDeck.length; i++) {
        newHand[k] = remainingDeck[i];
        k++;
    }
    return newHand;
}

更简洁的实现方式(用Java工具类)

Java的Arrays类提供了copyOfRange方法,可以直接截取数组的指定范围,省去手动循环的麻烦,代码更简洁且不易出错:

import java.util.Arrays;

public String[] discardTopCard(String[] remainingDeck) {
    if (remainingDeck.length <= 1) {
        return new String[]{};
    }
    // 从索引1开始截取到数组末尾,自动生成新数组
    return Arrays.copyOfRange(remainingDeck, 1, remainingDeck.length);
}

这个方法会帮你处理数组的创建和元素复制,你只需要指定起始和结束索引即可,完全避免了手动处理时可能出现的数组长度错误。

内容的提问来源于stack exchange,提问作者Danny Thompson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 02:33:22