有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java“If”生成NullPointerException

我正在编写一个程序,它使用双链接列表(我的实现)执行一些操作。 有一件事我不明白,这让我很困惑

嗯。所以我有两个双链表。我需要创建一个方法,其中参数是第一个双链接列表的索引,我需要在该索引上放置第二个列表

我写了这个方法:

    public void PutInPlace(int i){
        DoublyLinkedList ldw3 = new DoublyLinkedList(); // New doublylinked list.
        Node current = ldw1.tail; // ldw1 - First doublylinked list, created earlier.
        Node current1 = ldw2.tail;  //ldw2 - Second doublylinked list, created earlier.
        int counter = 0;

        while(true){
           ldw3.AddHead(current.number);
           current = current.prev;
           counter++;
           if(counter == i){  // THAT if makes NullPointerException

            ldw3.AddHead(current1.liczba);
            current1 = current1.prev;
            if(current1 == null)
                break;

        }
     }

我不想把所有的代码,因为它很长,不容易阅读。那么,为什么“if(counter==i)”会产生NullPointerException呢?如果没有“如果”程序的话。问题在哪里

谢谢你们的帮助,伙计们


共 (3) 个答案

  1. # 1 楼答案

    不,表示“如果”不能生成NullPointerException

    首先,确保重新编译所有内容,并运行测试。然后发布该测试的输出,包括异常的堆栈跟踪

    其次,逐字逐句地发布源代码(这样行号就清楚了)

    第三,发布PutInPlace方法的javap输出

  2. # 2 楼答案

    我认为当前变量是空的。i变量有一个唯一的值,比如说3

    而(true)是一个无限循环,您的条件(counter==i)将只执行一次(因为您总是递增counter,并且它只会命中值3一次)。因此,除非current1没有previous,否则break将永远不会是它,并且您将到达current没有previous的点(将其设为null,并在执行current.prev时给出异常)

    一个好的实践是,在使用对象的方法或属性之前,始终检查对象是否为null

  3. # 3 楼答案

    current1可能为空。但你正在努力获得价值

    if(current1 != null)
    {
       ldw3.AddHead(current1.liczba);
       current1 = current1.prev;
    }
    

    而不是

    current1 = current1.prev;
    

    (或)

    把这句话改成这样,

    if(current1 == null)
       break;
    ldw3.AddHead(current1.liczba);
    current1 = current1.prev;
    

    而不是

    ldw3.AddHead(current1.liczba);
    current1 = current1.prev;
    if(current1 == null)
       break;