【问题标题】:My code is throwing a NullPointerException in Java [duplicate]我的代码在 Java 中抛出 NullPointerException [重复]
【发布时间】:2015-04-23 05:28:12
【问题描述】:

我不知道为什么我的代码会抛出这个错误。我有一个可以容纳 maxCapacity = 100 的通用数组,如果用 currentSize 达到这个数字,则 maxCapacity 会加倍。当我执行以下测试时,它会引发 NullPointerException。为什么?注意:我的目的是从索引 1(不是 0)开始!!!!

测试:

for(int i=1; i <= 1100; i++)
    list.addLast(i);         

 System.out.println("Should print 1 .. i"); 


for(int x : list)
   System.out.print(x + " ");
System.out.println("\n");

这是我的代码:

    private E[] list;
    private int maxCapacity, currentSize;


    public ArrayLinearList(){
            currentSize = 0; 
            maxCapacity = DEFAULT_MAX_CAPACITY;
            list = (E[]) new Object[maxCapacity];
            //list[0] = null;
            }

    public void addLast(E obj){
            if(isFull()) //check if maxCap has been reached first
                doubleArraySize();
            System.out.println("Method called");
            if(currentSize == maxCapacity - 1)
                doubleArraySize();

            list[++currentSize] = obj;
            }

    ....

    private boolean isFull(){
                if(currentSize == maxCapacity)
                    return true;
                return false;
                }

private void doubleArraySize(){
    maxCapacity *= 2;
    System.out.println("doubling");
    E[] valuesHolder = (E[]) new Object[maxCapacity];

    for(int i = 1; i <= currentSize; i++)
        list[i] = valuesHolder[i];

        list = valuesHolder;
        }

【问题讨论】:

  • 我知道 NullPointerException 背后的概念。问题是我不知道为什么它在我的代码中这样做。
  • 如果您了解 NPE 背后的概念,您应该知道如何找到异常(空对象)的起源。您没有发布异常详细信息(堆栈跟踪、代码行、空对象),因此实际上无法为您提供帮助。请再次阅读链接问题的答案。
  • This answer 处理 NPE 故障排除。
  • 告诉我我是否正确,我想我可能已经找到了问题所在。我认为这是因为在测试中我试图执行 for(int x : list) 代码块实际上是用于对象(使用迭代器)并且在我的循环测试中我插入原始数据(Int)而不是实际的整数对象。对吗?
  • @JackGal 发布您的完整堆栈跟踪并指出导致空指针异常的代码行。

标签: java arrays generics nullpointerexception


【解决方案1】:

可能是这样的:

list[++currentSize] = obj;

尝试:

list[currentSize++] = obj;

此外,您的第一个元素将始终为空。

【讨论】:

  • 我故意从索引 1 开始。我尝试将我的代码更改为 list[currentSize++] = obj; 并没有解决问题:/
【解决方案2】:
for(int i = 1; i <= currentSize; i++)
  list[i] = valuesHolder[i];

这部分是罪魁祸首。您必须将“list”的内容复制到新创建的数组“valuesHolder”。相反,您正在以另一种方式进行操作,这会导致“空”条目。你必须做出的改变是这样的:

for(int i = 1; i <= currentSize; i++)
  valuesHolder[i] = list[i];

【讨论】:

  • 非常感谢!准确的反应。解决了我的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-31
相关资源
最近更新 更多