Исключение нулевого указателя в хэш-наборах для Apriori

#java #nullpointerexception #hashset #apriori

#java #исключение nullpointerexception #хэш-набор #априори

Вопрос:

Я разрабатываю программу apriori, которая должна подсчитывать, сколько раз определенный атрибут house появляется в текстовом файле. Программе необходимо подсчитать, сколько раз атрибут появляется сам по себе, сколько раз атрибуты появляются парами и группами по 3 . Я создал класс Subjects, который по существу соединяет атрибуты. Моей целью было прочитать файл, использовать класс subjects для разделения атрибутов на определенные категории и создать ArrayList этих атрибутов. Затем я создал HashSet атрибутов (и комбинаций атрибутов), используя вложенные циклы, я увеличу счетчик атрибутов в HashSet, чтобы определить, сколько раз они появляются.

Проблема в том, что я получаю исключение нулевого указателя в моем хэш-наборе. Я проверил, чтобы убедиться, что объект, который я добавляю в набор, не равен null, а его значения не равны null, но исключение все еще существует. Есть предложения? Я опубликую некоторые фрагменты кода ниже, но, пожалуйста, дайте мне знать, если вам нужно больше.

 //This is the loop giving me an error on the first iteration through:        
for (Subjects s: subjectListTwoElement){
    if(!s.equals(null)amp;amp;!s.identifier.equals(null)amp;amp;!s.partner.equals(null)){
        System.out.println(s.identifier s.partner s.count);
        subjectHolder.add(s);
    }
}
 

Это мои переменные и класс subjects:

 static ArrayList <Subjects> subjectList=new ArrayList();
static ArrayList <Subjects> subjectListTwoElement=new ArrayList();
static ArrayList <String> stringHolder=new ArrayList();

//keeps track of possible sets
static Set <String> ssv=new HashSet();

//possible values in next iteration
static Set <Subjects> subjectHolder=new HashSet();

static class Subjects {

    public String identifier="";
    public String partner="";
    public String partner2="";
    int count;

    public Subjects(String identifier, int count) {
        this.identifier = identifier;
        this.count=count;
    }

    public Subjects(String identifier, String partner, int count) {
        this.identifier = identifier;
        this.partner=partner;
        this.count=count;
    }

    public Subjects(String identifier, String partner, String partner2, int count) {
        this.identifier = identifier;
        this.partner=partner;
        this.partner2=partner2;
        this.count=count;
    }
    
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
          return true;
        if (obj == null)
          return false;
        if (getClass() != obj.getClass())
          return false;
        Subjects other = (Subjects) obj;
        if (identifier.equals(other.identifier)amp;amp;partner.equals(other.partner)) {
            return true;
        }
        return false;
    }

}
 

Это мой вывод:

 Single Attributes:
Curb: 598
Paved: 6834
Asphalt: 11087
Curb amp; Gutter: 3483
Unknown: 4731

Double Attributes:
CurbAsphalt0
Exception in thread "main" java.lang.NullPointerException
    at Code.printDouble(Code.java:178)
    at Code.main(Code.java:77)
 

Ответ №1:

вы должны изменить тест !s.identifier.equals(null) на s.identifier != null и сделать то же самое для теста на s.partner .

s.identifier.equals(null) выдаст исключение NullPointerException, если s.identifier оно равно нулю, поскольку вы пытаетесь вызвать метод для этого объекта.

Пожалуйста, дайте мне знать, если это полезно.

-Kaj 🙂