0

私は最初の 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);
    }
}

保存されたブール値は、保存するまでfalseであるはずですが、機能しているとは思いません。これは、問題が発生している可能性のある場所で呼び出される 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();
}

編集:読み取り/書き込みを変更し、名前が null であることを確認しようとした後、まだ機能しません。テキストを文字列に設定しようとしても、まだnullPointerExceptionが発生するため、FindViewById(R.id.Player1name)と関係があると思いますが、まだ正確にはわかりません。ViewPagerIndicator を使用して画面ごとに異なるビューを使用していますが、それと関係があるのでしょうか?

4

1 に答える 1

1

投稿した例外スタック トレースを参照してください。エラーはcaused by:行番号 72 でLife_counterActivity.javaあることが示されています。これにより、 null.

何号線かは不明ですが、おそらくこのように見える6号線のうちの1本だと思います…

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

2つの可能性があります...

  1. オブジェクトplayer1が null であるため、そのname.
  2. R.id.Player1name見つからない - これは可能性は低いですが、実際に null オブジェクトを返す場合は呼び出すことができませんsetText()

おそらくplayer1またはのように見えますがplayer2、オブジェクトをファイルに保存している場所を示していただけますか-ファイルからオブジェクトを作成しているが、変数を設定していないようです。が実装されているPlayerと仮定して、コードを表示してください。これらのメソッドについては、 Serializable Java ドキュメントを参照してください。PlayerSerializablewriteObject()readObject()

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();
}
于 2012-05-26T06:58:01.470 に答える