gpt4 book ai didi

java - Android 应用程序在从 java.lang.NullPointerException 读取对象时启动时崩溃

转载 作者:行者123 更新时间:2023-12-01 15:22:00 25 4
gpt4 key购买 nike

我正在开发我的第一个 Android 应用程序。它工作得很好,直到我决定添加一个功能来在 OnCreate 和 onRestart 上保存和加载对象和设置。之后应用程序在启动时崩溃。这是我从 OnCreate 调用的 setSettings。

public void setSettings(){
SharedPreferences settings = getSharedPreferences("Prefs",0);
newGame = settings.getBoolean("newGame", true);
autoDecide = settings.getBoolean("autoDecide", true);
saved = settings.getBoolean("saved", false);
if (saved){
player1 = readPlayer("Player 1");
player2 = readPlayer("Player 2");
((TextView)findViewById(R.id.Player1name)).setText(""+player1.name);
((TextView)findViewById(R.id.Player2name)).setText(""+player2.name);
((TextView)findViewById(R.id.player1wins)).setText(""+player1.totalWins);
((TextView)findViewById(R.id.player2wins)).setText(""+player2.totalWins);
((TextView)findViewById(R.id.Player1life)).setText(""+player1.life);
((TextView)findViewById(R.id.Player2life)).setText(""+player2.life);
}
}

在我保存东西之前,保存的 boolean 值应该是假的,但我认为它不起作用。这是它调用的 readPlayer,可能是问题所在。

    public Player readPlayer(String loc)  {
//FileInputStream fis;
try {
BufferedInputStream buf = new BufferedInputStream( openFileInput(loc));
ObjectInputStream stream = new ObjectInputStream(buf);
Player re = (Player) stream.readObject();
stream.close();
buf.close();
return re;
} catch (FileNotFoundException e) {
//e.printStackTrace();
return new Player(loc);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return new Player(loc);
}

这是我在崩溃时得到的 logCat。

05-26 03:49:05.739: E/AndroidRuntime(391): java.lang.RuntimeException: Unable to start activity    ComponentInfo{jjcard.app.lifecount/jjcard.app.lifecount.Life_counterActivity}: java.lang.NullPointerException
05-26 03:49:05.739: E/AndroidRuntime(391): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1815)
05-26 03:49:05.739: E/AndroidRuntime(391): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1831)
05-26 03:49:05.739: E/AndroidRuntime(391): at android.app.ActivityThread.access$500(ActivityThread.java:122)
05-26 03:49:05.739: E/AndroidRuntime(391): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1024)
05-26 03:49:05.739: E/AndroidRuntime(391): at android.os.Handler.dispatchMessage(Handler.java:99)
05-26 03:49:05.739: E/AndroidRuntime(391): at android.os.Looper.loop(Looper.java:132)
05-26 03:49:05.739: E/AndroidRuntime(391): at android.app.ActivityThread.main(ActivityThread.java:4123)
05-26 03:49:05.739: E/AndroidRuntime(391): at java.lang.reflect.Method.invokeNative(Native Method)
05-26 03:49:05.739: E/AndroidRuntime(391): at java.lang.reflect.Method.invoke(Method.java:491)
05-26 03:49:05.739: E/AndroidRuntime(391): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
05-26 03:49:05.739: E/AndroidRuntime(391): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
05-26 03:49:05.739: E/AndroidRuntime(391): at dalvik.system.NativeStart.main(Native Method)
05-26 03:49:05.739: E/AndroidRuntime(391): Caused by: java.lang.NullPointerException
05-26 03:49:05.739: E/AndroidRuntime(391): at jjcard.app.lifecount.Life_counterActivity.setSettings(Life_counterActivity.java:72)
05-26 03:49:05.739: E/AndroidRuntime(391): at jjcard.app.lifecount.Life_counterActivity.onCreate(Life_counterActivity.java:42)
05-26 03:49:05.739: E/AndroidRuntime(391): at android.app.Activity.performCreate(Activity.java:4397)
05-26 03:49:05.739: E/AndroidRuntime(391): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048)
05-26 03:49:05.739: E/AndroidRuntime(391): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1779)

我不知道您是否需要创建播放器,但它在这里

    public Player(String nameN){
name = nameN;
life = 8000;
totalWins = 0;
totalLosses = 0;
wins = new HashMap<String, Integer>();
}

每次我启动它时都会发生这种情况,并且我尝试了一些方法,正如您可能通过代码看到的那样,但没有成功。我尝试四处寻找,但找不到任何东西。希望大家能够帮忙。
编辑:这是 LogCat 显示的问题所在的第 72 行。

((TextView)findViewById(R.id.Player1name)).setText(""+player1.name);

所以看起来你是对的,它可能会读取一个空对象,而不是像我想象的那样返回一个新玩家。 由于我不太了解如何制作写入和读取对象,因此我只使用了 defaultWriteObject 和 defaultReadObject

    private void writeObject(ObjectOutputStream out) throws IOException{
out.defaultWriteObject();
}
private void readObject(ObjectInputStream in) throws ClassNotFoundException, IOException{
in.defaultReadObject();
}

编辑:更改读/写并尝试检查名称是否为空后,它仍然不起作用。我什至尝试将文本设置为字符串,但它仍然给出 nullPointerException,所以猜测它与 FindViewById(R.id.Player1name) 有关,但我还不知道到底是什么。我使用 ViewPagerIndicator 对不同的屏幕使用不同的 View ,这可能与它有关吗?

最佳答案

查看您发布的异常堆栈跟踪 - 它表示错误是 caused by: Life_counterActivity.java 中的第 72 行- 这将为您提供一些有关可能是 null 的对象的指示。 .

不知道它实际上是哪一行,它可能是看起来像这样的 6 行之一......

((TextView)findViewById(R.id.Player1name)).setText(""+player1.name);

有两种可能性...

  1. 对象 player1为 null,因此您不能请求其 name .
  2. R.id.Player1name无法找到 - 这种情况不太可能发生,但您无法调用 setText()如果它确实返回一个 null 对象。

看起来可能是player1player2 ,能否请您显示您保存 Player 的位置?文件的对象 - 看起来它可能正在从文件创建对象但不填充变量。假设Player实现Serializable ,你能显示writeObject()的代码吗?和readObject()请。引用Serializable java doc有关这些方法的信息。

所以,作为对您的 readObject() 的建议和writeObject()方法...

private void writeObject(ObjectOutputStream out) throws IOException{
out.writeObject(name);
out.writeInt(life);
out.writeInt(totalWins);
out.writeInt(totalLosses);
out.writeObject(wins);
}
private void readObject(ObjectInputStream in) throws ClassNotFoundException, IOException{
name = (String)in.readObject();
life = in.readInt();
totalWins = in.readInt();
totalLosses = in.readInt();
wins = (HashMap<String, Integer>) in.readObject();
}

关于java - Android 应用程序在从 java.lang.NullPointerException 读取对象时启动时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10763510/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com