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

标签 java android nullpointerexception objectoutputstream objectinputstream

我正在开发我的第一个 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/

相关文章:

android - 如何在 Android 12 中配置 Toast 图标?

Android 模拟器无法使用 HttpURLConeectioin 连接本地 tomcat 服务器

android - 在 Android 支持库中自定义导航 View

android - LAN socket programming - 获取空指针和地址使用异常

java - JTwain 无法在使用 servlet 的 jsp 中工作

java - Spring AOP 自定义注解

java - 将字符串数组从容器 Activity 传递到 fragment 时,getArguments() 返回 null

java - 什么是NullPointerException,我该如何解决?

java - 将 Constretto 2.0 与 Spring 3.2 集成

java - ManyToMany 的 JPA Criteria 规范