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

时间:2012-05-26 04:11:54

标签: 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);
    }
}

保存的布尔值应该是假的,直到我保存了东西,但我认为它不起作用。以下是问题所在的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();
}

编辑:更改读/写并尝试检查名称为空后,它仍然无法正常工作。我甚至尝试将文本设置为String并且仍然提供nullPointerException,因此猜测它与FindViewById(R.id.Player1name)有关,但我还不知道到底是什么。我使用ViewPagerIndicator为不同的屏幕使用不同的视图,这可能与它有关吗?

1 个答案:

答案 0 :(得分:1)

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

不知道它实际上是哪一行,它可能是6行中的一行......

null

有两种可能性......

  1. 对象((TextView)findViewById(R.id.Player1name)).setText(""+player1.name); 为空,因此您无法请求player1
  2. 无法找到name - 这种可能性较小,但如果确实返回空对象,则无法调用R.id.Player1name
  3. 看到它可能是setText()player1,您能否显示将player2对象保存到文件的位置 - 看起来它可能是从一个文件,但没有填充变量。假设Player实现Player,您能否显示SerializablewriteObject()的代码。有关这些方法的信息,请参阅Serializable java doc

    因此,作为readObject()readObject()方法的建议......

    writeObject()