Странное исключение нулевого указателя с InputStreams - PullRequest
1 голос
/ 14 апреля 2011

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

Вы можете получить исходный код, как сейчас здесь .

По сути, класс fileManager () рекурсивно просматривает папки, находит все .inis и помещает их в связанный список. Затем конструктор renderArea () заполняет город [] на основе числа .inis и их значений по умолчанию. Я получаю ошибку исключения нулевого указателя, когда пытаюсь передать местоположение файла plane.ini в конструктор для класса plane () как InputStream. Кто-нибудь может помочь?

class renderingArea extends JPanel {

public fileManager files;   
public city[] cities;

public renderingArea(){ 

            //  ... other code

    for( loop through all files in fileManager ){
        File current = files.ini.get(i);
        if(current.getName().contains("city")){
            try{
                InputStream cityStream = files.getResource(current.getName());
                InputStream planeStream = files.getResource("plane.ini");
                cities[index] = new city( cityStream, planeStream);
                cityStream.close();
                planeStream.close();
                index++;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    for( city current : cities){
        current.setCities(cities);
    }       
}

//  ============== Class City ========================

public class city {
private final String[] keys = {"x","y","name","population","planes_in_hanger"};

public float x;
public float y;
public int population;
public String name;
private Queue<passenger>[] waiting_passengers;  // queue[] parallel to cities.
private Queue<plane> planes_in_hanger;          // a queue is a first in first out ADT. Standard ops apply
private city[] cities;

private IniReader ini;

public city(InputStream inStream, InputStream inStreamPlane) throws IOException, FileNotFoundException {
    System.out.println("city: " + inStream.toString());
    System.out.println("plane: " + inStreamPlane.toString());

    ini = new IniReader();
    ini.load(inStream);

            // .... Other Code

    if(ini.properties.containsKey("planes_in_hanger")){
        try{
            for( int i = 0; i < Integer.parseInt(ini.properties.getProperty("planes_in_hanger")); i++){
                System.out.println("iter: "+i);
                System.out.println("plane: "+inStreamPlane.toString());
                planes_in_hanger.enqueue(new plane(inStreamPlane));
            }
        } catch (NumberFormatException e) {
            e.printStackTrace();
        }
    }
    }

public class plane {
private final String[] keys = {"x","y","max_velocity","passengers"};

public float x;
public float y;
public float max_velocity;
private float x_velocity;
private float y_velocity;
public city destination;
private passenger[] passengers;
public int max_passengers;

private IniReader ini;

    //====================== CLASS PLANE ======================

public plane(InputStream inStream) throws IOException, FileNotFoundException{
    ini = new IniReader();
    ini.load(inStream);

            //rest doesn't matter
}

Ouput:

// отладка, исключение

java.lang.NullPointerException
    at city.(city.java:72)
    at renderingArea.(flight_optimizer.java:70)
    at flight_optimizer_GUI.(flight_optimizer.java:103)
    at flight_optimizer.main(flight_optimizer.java:37)
Exception in thread "main" java.lang.NullPointerException
    at renderingArea.(flight_optimizer.java:80)
    at flight_optimizer_GUI.(flight_optimizer.java:103)
    at flight_optimizer.main(flight_optimizer.java:37)

1 Ответ

2 голосов
/ 14 апреля 2011

Вы, кажется, нигде не инициализируете новый planes_in_hanger, но объявляете его сверху. Это может быть вашей проблемой?

private Queue<plane> planes_in_hanger = new Queue<plane>();

Или вы можете просто инициализировать его в этом методе.

...