从存储中读取时遇到问题
Trouble reading from Storage
我现在已经更深入地了解了存储系统,但我就是无法让它正常工作。数据好像被保存了,保存的数据肯定不是空的而且我还是得到一个java.lang.NullPointerException.
所以这是我的 Class 我想保存并稍后读取到存储。
Band 是一个简单的 Class,具有名称和流派字符串。
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 只是一个 Class 和一个 ArrayList,Band 被添加到其中。
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";
}
}
因此,在其他一些 class 中,用户填写了一些 TextFields,乐队被添加到 BandList 中,因此我调用 saveListsToStorage();
public void saveListsToStorage(){
Storage.getInstance().clearStorage();
Storage.getInstance().writeObject("Bands", bandList);
}
所以现在,当启动应用程序时,应用程序会在存储中查找数据,如果找到,它将 return 存储 BandList 对象,否则将 return 一个新的 BandList 对象.
在此之前,我用
注册了 Classes
Util.register("Band", Band.class);
Util.register("BandList", BandList.class);
最后在main开头调用这个方法:
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 而不是 Shai 告诉我的 LinkedList,并且我按照指南中的说明实现了 Externalizable Interface。
也许你们中的一些人可以告诉我这里出了什么问题。
编辑:
这是例外情况:
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.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)
编辑 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();
}
NullPointerExceptions 是非常了不起的事情,因为它们不仅易于理解,甚至可以向您显示它们发生的确切行。您所要做的就是查看 .
的任何内容并检查它是否为空。一发现就发现问题
让我们看看您的代码。遗憾的是,我不知道哪一行是第 95 行,但我猜它是以 if
.
开头的那一行
这意味着 bandList
为空或 bandList.getBandList()
return 为空。快速查看 getBandList()
表明它不会为空,因为您在 BandList class 的构造函数中初始化列表。只剩下 bandList
.
遗憾的是你没有 post 你从哪里得到的,但我假设你只是做了类似的事情:
BandList bandList = loadSavedBandList();
那么让我们研究一下该方法。 (顺便说一句:如果你在这个答案的末尾没有这样做,我会多说一些你必须看的地方)。
如果您找不到您的密钥,它将 return 一个新的 BandList,它不能为 null。所以它必须找到一些东西,这意味着键存在但值为空。
所以让我们更进一步,看看您最初是如何保存东西的。
public void saveListsToStorage(){
Storage.getInstance().clearStorage();
Storage.getInstance().writeObject("Bands", bandList);
}
现在"in some other class"并没有真正解释太多。但是既然你读到了一个空值,就意味着你在这里写了一个空值。这意味着在这个 "other class" 中,至少在这个方法中,bandList = null
.
使用你提供的代码,我不可能更深入地研究这个问题,但似乎在 "that other class" 中,你有一个名为 bandList 的 class 属性,但无法将任何内容放入其中它。
或者您可能保存了所有内容,但没有调用
BandList bandList = loadSavedBandList();
在您的 if
之前以某种形式出现,这也可以很好地解释问题。我的意思是...如果您从不加载 bandList,它显然将为空...
我现在已经更深入地了解了存储系统,但我就是无法让它正常工作。数据好像被保存了,保存的数据肯定不是空的而且我还是得到一个java.lang.NullPointerException.
所以这是我的 Class 我想保存并稍后读取到存储。
Band 是一个简单的 Class,具有名称和流派字符串。
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 只是一个 Class 和一个 ArrayList,Band 被添加到其中。
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";
}
}
因此,在其他一些 class 中,用户填写了一些 TextFields,乐队被添加到 BandList 中,因此我调用 saveListsToStorage();
public void saveListsToStorage(){
Storage.getInstance().clearStorage();
Storage.getInstance().writeObject("Bands", bandList);
}
所以现在,当启动应用程序时,应用程序会在存储中查找数据,如果找到,它将 return 存储 BandList 对象,否则将 return 一个新的 BandList 对象.
在此之前,我用
注册了 Classes Util.register("Band", Band.class);
Util.register("BandList", BandList.class);
最后在main开头调用这个方法:
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 而不是 Shai 告诉我的 LinkedList,并且我按照指南中的说明实现了 Externalizable Interface。
也许你们中的一些人可以告诉我这里出了什么问题。
编辑:
这是例外情况:
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.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)
编辑 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();
}
NullPointerExceptions 是非常了不起的事情,因为它们不仅易于理解,甚至可以向您显示它们发生的确切行。您所要做的就是查看 .
的任何内容并检查它是否为空。一发现就发现问题
让我们看看您的代码。遗憾的是,我不知道哪一行是第 95 行,但我猜它是以 if
.
这意味着 bandList
为空或 bandList.getBandList()
return 为空。快速查看 getBandList()
表明它不会为空,因为您在 BandList class 的构造函数中初始化列表。只剩下 bandList
.
遗憾的是你没有 post 你从哪里得到的,但我假设你只是做了类似的事情:
BandList bandList = loadSavedBandList();
那么让我们研究一下该方法。 (顺便说一句:如果你在这个答案的末尾没有这样做,我会多说一些你必须看的地方)。
如果您找不到您的密钥,它将 return 一个新的 BandList,它不能为 null。所以它必须找到一些东西,这意味着键存在但值为空。
所以让我们更进一步,看看您最初是如何保存东西的。
public void saveListsToStorage(){
Storage.getInstance().clearStorage();
Storage.getInstance().writeObject("Bands", bandList);
}
现在"in some other class"并没有真正解释太多。但是既然你读到了一个空值,就意味着你在这里写了一个空值。这意味着在这个 "other class" 中,至少在这个方法中,bandList = null
.
使用你提供的代码,我不可能更深入地研究这个问题,但似乎在 "that other class" 中,你有一个名为 bandList 的 class 属性,但无法将任何内容放入其中它。
或者您可能保存了所有内容,但没有调用
BandList bandList = loadSavedBandList();
在您的 if
之前以某种形式出现,这也可以很好地解释问题。我的意思是...如果您从不加载 bandList,它显然将为空...