2017-02-17 10 views
0

Я пытаюсь создать класс объектов LinkedSet, который реализует модифицированный интерфейс Set. Я получаю исключение NullPointerException при попытке проверить, указывает ли firstNode значение null или нет. Я не уверен, как решить эту проблему.Получение NullPointer реализации LinkedSet

Вот соответствующий код.

Конструктор для общего множества объектов

public class LinkedSet<T> implements Set<T> { 

    private Node firstNode; 

    public LinkedSet() { 
     firstNode = null; 
    } // end Constructor 

Метод, который держит меня

public int getSize() { 
    int size = 1; 
    Node current = firstNode; 

    while ((current.next) != null) { 
     size++; 
     current = current.next; 
    } 
    return size; 
} // end getSize() 

IsEmpty метод()

public boolean isEmpty() { 
    Node next = firstNode.next; //Get error here 
    if (next.equals(null)) { 
     return true; 
    } 
    return false; 
} // end isEmpty() 

Здесь частный внутренний класс для Node объектов

private class Node { 
    private T data; 
    private Node next; //Get Error here 

    private Node(T data, Node next) { 
     this.data = data; 
     this.next = next; 
    } // end Node constructor 

    private Node(T data) { 
     this(data, null); 
    }// end Node constructor 
} // end Node inner Class 

И, наконец, основной метод тестера.

public class SetTester { 

    public static void main(String[] args) { 
     LinkedSet<String> set = new LinkedSet<String>(); 
     System.out.println(set.getSize()); //Get error here 
    } 
} 
+2

firstNode = нуль ; на ваш конструктор бросает это –

+1

В дополнение к другим предложениям: в 'getSize()' Я считаю, что вы должны инициализировать 'size' до 0 и использовать' current! = null' в качестве условия 'while'. –

ответ

0

В

public class LinkedSet<T> implements Set<T> { 

    private Node firstNode; 

    public LinkedSet() { 
     firstNode = null; 
    } // end Constructor 

firstNode является недействительным и вы не инициализации памяти в узел и доступа к нему afterwards.That причина вы получаете исключения нулевого указателя, потому что вы обращаетесь к нулю. Измените его.

public class LinkedSet<T> implements Set<T> { 
private Node firstNode; 

public LinkedSet() { 
    firstNode = new Node(); 
} // end Constructor 

Чтобы проверить пустой

public boolean isEmpty() { 
    return firstNode==null; 
} // end isEmpty() 

Node Class

private class Node { 
    private T data; 
    private Node next; //Get Error here 
    private Node(T data, Node next) { 
     next= new Node(); 
     this.data = data; 
     this.next = next; 
    } // end Node constructor 

    private Node(T data) { 
     this(data, null); 
    }// end Node constructor 
} // end Node inner Class 

Главная

public class SetTester { 

    public static void main(String[] args) { 
     LinkedSet<String> set = new LinkedSet<String>(); 
     System.out.println(set.isEmpty()); 
    } 
} 
+1

Разве это не делает this.isEmpty() всегда ложным? –

1

Вы должны проверить, если firstNode является null, прежде чем пытаться обратитесь к нему в строке с ошибкой, так как вы инициализируете его null.

4

Ваш комплект пуст, если у него нет узлов. Поэтому ваша реализация isEmpty() является вашей проблемой, так как предполагается, что у вас всегда есть firstNode, хотя вы явно задали его в null в конструкторе.

Попробуйте это:

public boolean isEmpty() { 
    return firstNode == null; 
} 

Edit после первой проблемы была отредактирована прочь:

Вы все еще получить доступ к нулю (что вызывает NullPointerException), так как вы установили current к firstNode, который в свою очередь, еще никогда было установлено значение ничего, кроме нулевого.

+0

Это действительно исправляет этот метод, но у меня все еще возникают проблемы с другими. –

+2

Пожалуйста, не редактируйте код, в котором была проблема - тогда все ответы будут казаться бессмысленными. – DuneCat

2
public boolean isEmpty() { 
    Node next = firstNode.next; //Get error here 
    if (next.equals(null)) { 
     return true; 
    } 
    return false; 
} // end isEmpty() 

Эта линия дает NullPointerException, я надеюсь:

Node next = firstNode.next; //Get error here 

Поскольку firstNode вероятно null и не указывая где-либо до сих пор. Также рекомендуется обрабатывать NullPointerException. Итак, что вы должны сделать, это:

public boolean isEmpty() { 
    if (firstNode == null) { return true;} 
    return false; 
} // end isEmpty() 

Кроме того, не проверить нуль, как:

next.equals(null)

Всегда проверяйте как:

null == next или next == null

Смежные вопросы