2014-12-09 7 views
-2

Я получаю ошибку исключения нулевого указателя при запуске метода runSnackBar, и я не могу понять почему. Когда я получаю эту ошибку, BlueJ выделяет первую строку в методе randomFlavour, но я понятия не имею, почему. Пожалуйста помоги.Почему мой код Java дает мне ошибку NullPointerException?

import java.util.Random; 
    import java.util.ArrayList; 

    public class SnackBar 
    { 
    private Random randomGenerator; 

    private String[] packets; 

    private SnackMachine newSnackMachine; 

    private ArrayList<Student> students; 

    public SnackBar(int numOfStudents, int numPackOfCrisps, int cost) 
    { 
     randomGenerator = new Random(); 

     String[] packets = {"ready salted", "cheese and onion", "salt and vinegar" , "smokey bacon"}; 

     newSnackMachine = new SnackMachine(numPackOfCrisps , cost); 

     for(int n=0 ; n < numPackOfCrisps ; n++){ 
      newSnackMachine.addPack(new PackOfCrisps(randomFlavour())); 
     } 
     students = new ArrayList<Student>(); 

     for(int i=0 ; i < numOfStudents ; i++){ 
      students.add(new Student(randomFlavour(), newSnackMachine)); 
     } 


    } 

    private String randomFlavour() 
    { 
     int index = randomGenerator.nextInt(packets.length); 
     return packets[index]; 

    } 

    public void describe(){ 
     System.out.println("The SnackBar has" + students.size() + "hungry students"); 
     System.out.println("The SnackMachine has:" + newSnackMachine.countPacks("ready salted") + "packets of ready salted crisps"); 
     System.out.println("," + newSnackMachine.countPacks("cheese and onion") + "of cheese and onion crisps"); 
     System.out.println("," + newSnackMachine.countPacks("salt and vinegar") + "of salt and vinegar crisps"); 
     System.out.println("," + newSnackMachine.countPacks("smokey bacon") + "of smokey bacon crisps"); 

    } 
    public void runSnackBar(int nSteps){ 
     for(int x=1 ; x < nSteps ; x++){ 
      System.out.println("Time step" + x); 
      describe(); 
      int y = randomGenerator.nextInt(students.size()); 
      students.get(y).snackTime(); 
     } 


    } 
} 
+2

В какой строке находится NPE? –

+0

Трассировка стека, показывающая ошибку, была бы наиболее полезной. – Krease

+0

int index = randomGenerator.nextInt (packets.length); –

ответ

3
private String[] packets; 

packets является назначен null по умолчанию, а вот

String[] packets = {"ready salted", "cheese and onion", 
        "salt and vinegar" , "smokey bacon"}; 

вы объявляющий локальной переменной. Таким образом, вы получаете NPE здесь:

int index = randomGenerator.nextInt(packets.length); 
            ↑ 
            null 

JLS 4.12.5. Initial Values of Variables:

Для всех ссылочных типов (§4.3), значение по умолчанию равно нулю.

ArrayType является ReferejceType

1

Вы пытались инициализировать packets в конструкторе, но вы случайно создали локальную переменную.

Изменить

String[] packets = {"ready salted", "cheese and onion", "salt and vinegar" , "smokey bacon"}; 

в

packets = new String[] {"ready salted", "cheese and onion", "salt and vinegar" , "smokey bacon"}; 

так packets относится к переменной экземпляра, поэтому он инициализируется правильно.

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