2016-10-22 2 views
1

Теперь у меня был более глубокий взгляд на систему хранения, но я просто не могу заставить его работать правильно. Кажется, что данные сохранены, сохраненные данные определенно не пусты, и я все еще получаю java.lang.NullPointerException.Чтение неисправностей из хранилища

Итак, вот мой класс, который я хочу сохранить, а затем прочитал в Хранилище.

Группа - тривиальный класс с именем и жанром String.

public class Band implements Externalizable{ 
    String name; 
    String genre; 

    public Band(String bnd, String gen){ 
     this.name = bnd; 
     this.genre = gen; 
    } 
    public Band() { 

    } 

    public String getName(){ 
     return this.name; 
    } 
    public String getGenre() { return this.genre; } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public void setGenre(String genre) { 
     this.genre = genre; 
    } 

    @Override 
    public String toString(){ 
     String s; 
     s = this.name; 
     return s; 
    } 
    public int getVersion(){ 
     return 1; 
    } 

    @Override 
    public void externalize(DataOutputStream out) throws IOException { 
     Util.writeUTF(name, out); 
     Util.writeUTF(genre, out); 
    } 

    @Override 
    public void internalize(int version, DataInputStream in) throws IOException { 
     name = Util.readUTF(in); 
     genre = Util.readUTF(in); 
    } 

    public String getObjectId(){ 
     return "Band"; 
    } 

} 

BandList - это просто класс с ArrayList, к которым добавляются группы.

public class BandList implements Externalizable{ 
    List <Band> bandList; 

    public List getBandList(){ 
     return this.bandList; 
    } 

    public BandList(){ 
     bandList = new ArrayList<Band>(); 
    } 

    public void setBandList(List<Band> bandList) { 
     this.bandList = bandList; 
    } 

    public int getVersion(){ 
     return 1; 
    } 

    @Override 
    public void externalize(DataOutputStream out) throws IOException { 
     Util.writeObject(bandList, out); 
    } 

    @Override 
    public void internalize(int version, DataInputStream in) throws IOException { 
     bandList = (ArrayList<Band>) Util.readObject(in); 
    } 

    public String getObjectId(){ 
     return "BandList"; 
    } 
} 

Таким образом, в какой-то другой класс, где заполнены в некоторых TextFields пользователь, группа добавляется к BandList и поэтому я называю saveListsToStorage();

public void saveListsToStorage(){ 
     Storage.getInstance().clearStorage(); 
     Storage.getInstance().writeObject("Bands", bandList); 
    } 

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

До этого я REGIST в классы с

Util.register("Band", Band.class); 
    Util.register("BandList", BandList.class); 

и, наконец, этот метод вызывается в основной в начале:

public BandList loadSavedBandList() { 
     String[] temp = Storage.getInstance().listEntries(); 
     for (String s : temp) { 
      if (s.equals("Bands") == true) { 
       BandList tempBand = (BandList) Storage.getInstance().readObject("Bands"); 
       return tempBand; 
      } 
     } 
     return new BandList(); 
    } 

После сохранения и последующей загрузки он бросает исключение NullPointer и я не знаю, почему. Теперь я использовал ArrayList вместо LinkedList, как сказал мне Shai, и я внедрил интерфейс Externalizable, как сказано в руководстве.

Возможно, некоторые из вас могут сообщить мне, что здесь не так.

Edit:

Вот исключение:

java.lang.NullPointerException 
    at com.rosscode.gehma.Menu_Form.updateBandContainer(Menu_Form.java:95) 
    at com.rosscode.gehma.Menu_Form.<init>(Menu_Form.java:73) 
    at com.rosscode.gehma.main.start(main.java:61) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at com.codename1.impl.javase.Executor$1$1.run(Executor.java:106) 
    at com.codename1.ui.Display.processSerialCalls(Display.java:1152) 
    at com.codename1.ui.Display.mainEDTLoop(Display.java:969) 
    at com.codename1.ui.RunnableWrapper.run(RunnableWrapper.java:120) 
    at com.codename1.impl.CodenameOneThread.run(CodenameOneThread.java:176) 

Edit 2, строка 95:

if(bandList.getBandList().isEmpty() == false) { 
      for (int i = 0; i < bandList.getBandList().size(); i++) { 
       Button temp = new Button(bandList.getBandList().get(i).toString()); 
       temp.addActionListener((e) -> 
         nextStep() 
       ); 
       listCont.add(temp); 
      } 
      menuForm.revalidate(); 
     } 
+0

Вы включили все все, кроме стека NullPointerExcepiton, из консоли. Можете ли вы отредактировать свой пост и включить в него, а затем оставить комментарий здесь, чтобы я увидел, что вы внесли изменения? –

+0

Привет, я добавил Исключительный стек. В методе updateBandContainer() он обновляет BandsContainer, итерируя через Band List и добавляя каждый Band в качестве кнопки. –

+0

Итак, что такое код и, в частности, строка 95? –

ответ

1

NullPointerExceptions довольно удивительные вещи, потому что они не только легко понять, , они даже показывают вам точную линию, где они происходят. Все, что вам нужно сделать, это посмотреть на все, что осталось от ., и проверить, является ли оно нулевым. Как только вы его найдете, вы обнаружите проблему.

Итак, давайте посмотрим на ваш код. К сожалению, я не знаю, какая из этих строк - строка 95, но я предполагаю, что она начинается с if.

Это означает, что bandList есть null или null null null. Быстрый просмотр в getBandList() показывает, что он не будет пустым, поскольку вы инициализируете список в конструкторе вашего класса BandList. Который оставляет только bandList.

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

BandList bandList = loadSavedBandList(); 

Итак, давайте посмотрим на этот метод.(Кстати: я говорю немного больше о том, где вы должны смотреть, если вы не сделали этого в конце этого ответа).

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

Итак, давайте сделаем еще один шаг и посмотрим, как вы, в первую очередь, спасаете вещи.

public void saveListsToStorage(){ 
    Storage.getInstance().clearStorage(); 
    Storage.getInstance().writeObject("Bands", bandList); 
} 

Теперь «в каком-то другом классе» на самом деле не очень много объясняет. Но поскольку вы читаете нуль, это означает, что вы пишете нуль здесь. Что будет означать в этом «другом классе», по крайней мере, в этом методе, bandList = null.

С кодом, который вы указали, я не могу глубже вникать в эту проблему, но, похоже, в «этом другом классе» вы получили атрибут класса с именем bandList, но не смогли вставить что-либо в него.


Или, может быть, вы сохранили все правильно, но не называли

BandList bandList = loadSavedBandList(); 

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

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