2012-03-08 2 views
1

Я делаю программу на Java, которая читает в некоторых материалах из файла и сохраняет все в массиве. Каждый слот в массиве является связанным списком. Я получаю исключение Null Pointer Exception, и я не знаю почему. Я довольно новичок в программировании, и у меня ужасное чувство, что это что-то очевидное, чего я не вижу, но это займет всех, кто смотрит на него, о, я не знаю, может быть, две секунды, чтобы понять это. .. тогда я буду чувствовать себя глупо, но в любом случае, здесь идет ...null Указатель исключения для struct в Java-программе

NPE, согласно моему отладчику (я использую Eclipse), находится в классе GiveJob. Я заметил линию со всеми шапками, чтобы облегчить ее поиск.

Моя первая мысль о NPE заключается в том, что она должна иметь какое-то отношение к тому факту, что у меня есть массив структур. Насколько я понимаю, каждый слот в массиве объектов автоматически инициализируется значением null при использовании Java, и я думал, что это будет включать в себя массив структур. Я ошибаюсь?

Любая помощь очень высоко оценили, как я был ломать голову над этим в течение некоторого времени теперь :-P

Вот класс для массива:

public class Person{ 
String name; 
Jobs jobs; 
} 

Вот класс для связанный список:

public class Jobs{ 
String typeOfJob; 
Jobs next; 
} 

Вот класс для придания человеку работу:

public void GiveJob(String personName, String newJob int N, Person[] people){ 

    //go through the array of people to see if the person already exists 
    for(int i=0; i<N; i++){ 

     //check to see if the person has already been added 
     if(people[i].jobs != null){     //NULL POINTER EXCEPTION 
      if(people[i].jobs.compareToIgnoreCase(newJob) == 0){ 

       //if the person has been added, check to see if the job has 
       //already been added 
       Jobs currentNode = people[i].jobs; 
       while(currentNode.next != null){ 
        //if the job has already been added, break 
        if(currentNode.typeOfJob.compareToIgnoreCase(newJob) == 0){ 
         break; 
        } 
        currentNode = currentNode.next; 
       } 
       //if the job has already been added, break 
       if(currentNode.typeOfJob.compareToIgnoreCase(newJob) == 0){ 
        break; 
       } 
       else{ 
        Jobs tempNode = new Jobs(); 
        tempNode.typeOfJob = newJob; 
        tempNode.next = null; 
        people[i].jobs.next = tempNode; 
       }    
      }//end if the job has already been added 
     } 

     //if the person has not been added yet, add him/her 
     else if(people[i] == null){ 
      people[i].name = personName; 
      Jobs tempNode = new Jobs(); 
      tempNode.typeOfJob = newJob; 
      tempNode.next = null; 
      people[i].jobs = tempNode; 
      break; 
     } 
    }//end for(int i=0; i<N; i++) - checking if the city has been added already 
}//end addToAdjList method 

}//end AdjacencyList class 

Вот класс, содержащий основные:

import java.io.*; 
import java.util.*; 

public class LookingForAJob { 

public static void main(String[] args) { 

    //read in file 
    try{ 
     File filename = new File("jobListing.txt"); 
     Scanner fin = new Scanner(filename); 

     //read in the number of people (N) from file 
     int N = fin.nextInt(); 
     //read in the number of jobs available (M) from file 
     int M = fin.nextInt(); 

     //create a new instance of GiveJob 
     GiveJob jobSearch = new GiveJob(); 

     //Create the array to put the people into 
     Person people[] = new Person[N]; 

     //read in information from file 
     for(int i=0; i<M; i++){ 

      //get person's name 
      String personName = fin.next();    
      //get job name 
      String jobName = fin.next(); 

      //put what was read in from the file into an linked list 
      jobSearch.GiveJob(personName, jobName, N, people); 

     }//end for(int i=0; i<M; i++) 

    }//end try 
    catch(FileNotFoundException e){ 
     System.err.println("Input file not found for reading!"); 
     System.exit(0); 
    } 
    catch(Exception e){ 
     System.err.println("Input file not in correct format"); 
     System.exit(0); 
    } 

} 

}

+0

Просто хочу убедиться - вы создали экземпляры любых значений, которые вы используете в первых двух классах? – Amndeep7

+0

Другой вопрос, связанный как с моими, так и с @Radu, сможет ли вы распечатать значение 'i', когда вы получите NPE? – Amndeep7

+0

В некотором смысле @Radu прав, делая «Person people [] = new Person [N];' создает только массив, но не создает объекты типа Person. Вам нужно инициализировать каждый элемент массива. http://www.cs.usfca.edu/~wolber/courses/110/lectures/ArrayOfObjs.htm – madth3

ответ

4

Оказывается, что существует множество вещей неправильно с вашим кодом - к сожалению, ваша попытка уменьшения количества код, отправленный в вашем вопросе (что обычно хорошо), также имеет обратную реакцию, поскольку затрудняет определение ошибок в коде и то, что является ошибкой, когда вы копируете вложенные файлы.

Просто одна заметка, прежде чем я начну объяснять вам кое-что, вы можете посмотреть на некоторые веб-сайты или другие места, которые он lp переход от языка C к Java, поскольку вы получаете некоторые фундаментальные вещи неправильно. Это не вступает в противоречие с вашими возможностями программирования, вы просто не знаете некоторых вещей, которые отличает Java от C, например, как выполнять условные обозначения.

В любом случае, я думаю, проблема в том, что значения в ваших классах и фактически сами классы еще не были инициализированы/созданы (вы назвали их, поскольку теперь вы можете устанавливать значения для них и и так далее, но у них пока нет никаких значений). Сначала давайте позаботимся о маленьких делах, вам нужно будет создавать ценности в ваших классах, таких как «Рабочие места» и «Человек». Способ сделать это через конструктор (пожалуйста, просто взгляните на введение в веб-сайт программирования Java или книгу, если вы не уверены в вещах, о которых я говорю). После того, как вы убедитесь, что значения таких вещей, как name, не являются нулевыми, вам нужно создать экземпляр своего класса Person. Кажется, вы хотите сделать это в методе GiveJob (который назван в неприемлемом стиле, а также отсутствует объявление типа для одного из аргументов). Поэтому вам придется создавать объекты Person (что-то вроде строк people[i] = new Person(/*args*/)).

Особая проблема, которую вы просите решить, заключается в том, что у вас нет экземпляра Person в вашем массиве людей. Однако вы пытаетесь получить доступ (еще раз неподходящим образом) к переменной из этого Лица. Этот человек не существует, он имеет тип null. null не имеет переменной jobs, которая принадлежит ей. Поэтому вы получаете ошибку Null Pointer.

@ratchet freak и @SQiShER имеют возможность исправить его соответствующим образом. Тем не менее, вы все равно захотите взглянуть на основные руководства по кодированию Java, чтобы помочь вам адаптироваться к новой ситуации и соответствующим стилистическим способам делать что-то.

+0

Спасибо тонну - это ОГРОМНАЯ помощь. Хорошая уловка в объявлении отсутствующего типа в GiveJob, кстати :-) – Tabitha

+0

И, между прочим, вы правы со мной, исходя из фона C, LOL. – Tabitha

+0

Нет проблем, спасибо за эту зеленую галочку там - ее очень оценили. – Amndeep7

1
Person people[] = new Person[N]; 

Это просто создает массив размера N, заполненный NULL. Я не вижу кода инициализации , прежде чем вы звоните people[i].job в GiveJob функция. Нечто подобное,

for(int i=0; i<N ;i++){ 
    people[i] = new Person(); 
} 
+0

Это неполное решение. Если вы посмотрели на комментарии, которые мы получили до сих пор, похоже, что не только экземпляры экземпляра пользователя пустые, но и значения внутри клана песчаники – Amndeep7

+0

Спасибо, этот маленький фрагмент кода был очень полезен. – Tabitha

0
for(int i=0; i<N; i++){ 

     //check to see if the person has already been added 
     if(people[i].jobs != null){     //NULL POINTER EXCEPTION 

Вместо того, что вы должны пройти через ваш массив как это:

 for(int i=0; i<people.length; i++){ 
        if(people[i].jobs != null){  
} 

И в этой строке запятая отсутствует также:

public void GiveJob(String personName, String newJob int N, Person[] people) 

После строки, до int

0

простое решение было бы изменить порядок ваших, если условия, чтобы вы сначала проверить, является ли элемент массива нулевой, и если да, то инициализировать его, назначив новый Person экземпляр так: people[i] = new Person()

Фиксированный код:

Вам необходимо сделать это, потому что элементы массива, созданные с помощью Person people[] = new Person[N];, по-прежнему равны нулю, поэтому память для свойств, которые вы пытаетесь получить, еще не выделена.Java не имеет ничего похожего на C-структуры, поэтому ваш struct - это просто простой объект Java, который необходимо создать с помощью нового, прежде чем его поля будут доступны.

+0

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

+0

Рад, что я мог помочь. – SQiShER

0

поменять местами, если вокруг: сначала проверить, если человек был добавлен, а затем проверить его работу:

for(int i=0; i<people.length; i++){ 
    //if the person has not been added yet, add him/her 
    if(people[i] == null){ 
     people[i] = new Person(); 
     people[i].name = personName; 
     Jobs tempNode = new Jobs(); 
     tempNode.typeOfJob = newJob; 
     tempNode.next = null; 
     people[i].jobs = tempNode; 
     break; 
    }   

    //check to see if the person has already been added 
    if(people[i].jobs != null){     //NULL POINTER EXCEPTION 
     if(people[i].jobs.compareToIgnoreCase(newJob) == 0){ 

      //if the person has been added, check to see if the job has 
      //already been added 
      Jobs currentNode = people[i].jobs; 
      while(currentNode.next != null){ 
       //if the job has already been added, break 
       if(currentNode.typeOfJob.compareToIgnoreCase(newJob) == 0){ 
        break; 
       } 
       currentNode = currentNode.next; 
      } 
      //if the job has already been added, break 
      if(currentNode.typeOfJob.compareToIgnoreCase(newJob) == 0){ 
       break; 
      } 
      else{ 
       Jobs tempNode = new Jobs(); 
       tempNode.typeOfJob = newJob; 
       tempNode.next = null; 
       people[i].jobs.next = tempNode; 
      }    
     }//end if the job has already been added 
    } 
} 
Смежные вопросы