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
相关产品推荐
相关产品推荐

