1

実際にプロジェクトに取り掛かる前に、Android 開発の基本原則と考えられることを実践したかったのです。私は現在ChipCount、プレイヤーが持っているチップの量を保存およびロードするクラスを持っています。クラスはまた、一般的なチップの量を追跡する責任があります。

ChipCountのクラスは現在次のようになっています。

package com.example.parceltest;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import android.content.Context;

public class ChipCount {

    private int number_of_chips;
    Context file_context;

    public ChipCount() {
        loadChips();
    }

    public void setChips(int chips) {
        this.number_of_chips = chips;
    }

    public int getChips() {
        return number_of_chips;
    }

    public void saveChips() {
        String filename = "chipsave";
        String save_string = String.valueOf(number_of_chips);

        try {
            FileOutputStream output = file_context.getApplicationContext().openFileOutput(filename, Context.MODE_PRIVATE);
            output.write(save_string.getBytes());
            output.close();
        } catch(IOException e) {

        }

    }

    public void loadChips() {
        String filename = "chipsave";
        String chip_count = "";

        try {
            FileInputStream input = file_context.getApplicationContext().openFileInput(filename);
            input.read(chip_count.getBytes());
        } catch(IOException e) {
            this.setChips(500);
        }
    }

}

MainActivity利用しようとするものもありますChipCountが、クラッシュします。

package com.example.parceltest;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends Activity {

    ChipCount chips = new ChipCount();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView number_of_chips = (TextView) findViewById(R.id.number_of_chips);
        int chip = chips.getChips();
        //number_of_chips.setText("500");
    }

}

さまざまな行をコメントアウトすることで、問題が行にあると判断しましたint chip = chips.getChips();

これによりプログラムがクラッシュするのはなぜですか。どうすれば修正できますか。

ログキャットは次のとおりです。

10-01 22:51:06.958: I/Process(28051): Sending signal. PID: 28051 SIG: 9
10-01 22:51:26.669: D/AndroidRuntime(28106): Shutting down VM
10-01 22:51:26.669: W/dalvikvm(28106): threadid=1: thread exiting with uncaught exception (group=0x40b7c300)
10-01 22:51:26.669: E/AndroidRuntime(28106): FATAL EXCEPTION: main
10-01 22:51:26.669: E/AndroidRuntime(28106): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.parceltest/com.example.parceltest.MainActivity}: java.lang.NullPointerException
10-01 22:51:26.669: E/AndroidRuntime(28106):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1983)
10-01 22:51:26.669: E/AndroidRuntime(28106):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
10-01 22:51:26.669: E/AndroidRuntime(28106):    at android.app.ActivityThread.access$600(ActivityThread.java:130)
10-01 22:51:26.669: E/AndroidRuntime(28106):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
10-01 22:51:26.669: E/AndroidRuntime(28106):    at android.os.Handler.dispatchMessage(Handler.java:99)
10-01 22:51:26.669: E/AndroidRuntime(28106):    at android.os.Looper.loop(Looper.java:137)
10-01 22:51:26.669: E/AndroidRuntime(28106):    at android.app.ActivityThread.main(ActivityThread.java:4745)
10-01 22:51:26.669: E/AndroidRuntime(28106):    at java.lang.reflect.Method.invokeNative(Native Method)
10-01 22:51:26.669: E/AndroidRuntime(28106):    at java.lang.reflect.Method.invoke(Method.java:511)
10-01 22:51:26.669: E/AndroidRuntime(28106):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
10-01 22:51:26.669: E/AndroidRuntime(28106):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
10-01 22:51:26.669: E/AndroidRuntime(28106):    at dalvik.system.NativeStart.main(Native Method)
10-01 22:51:26.669: E/AndroidRuntime(28106): Caused by: java.lang.NullPointerException
10-01 22:51:26.669: E/AndroidRuntime(28106):    at com.example.parceltest.ChipCount.loadChips(ChipCount.java:45)
10-01 22:51:26.669: E/AndroidRuntime(28106):    at com.example.parceltest.ChipCount.<init>(ChipCount.java:15)
10-01 22:51:26.669: E/AndroidRuntime(28106):    at com.example.parceltest.MainActivity.<init>(MainActivity.java:9)
10-01 22:51:26.669: E/AndroidRuntime(28106):    at java.lang.Class.newInstanceImpl(Native Method)
10-01 22:51:26.669: E/AndroidRuntime(28106):    at java.lang.Class.newInstance(Class.java:1319)
10-01 22:51:26.669: E/AndroidRuntime(28106):    at android.app.Instrumentation.newActivity(Instrumentation.java:1053)
10-01 22:51:26.669: E/AndroidRuntime(28106):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1974)
10-01 22:51:26.669: E/AndroidRuntime(28106):    ... 11 more
4

2 に答える 2

2

を初期化することはありませんchips。したがってnull、それは であるため、そのメソッドにアクセスすることはできません。

の代わりにChipCount chips;、次を試してくださいChipCount chips = new ChipCount();

注意: また、将来的にクラッシュが発生した場合は、LogCat エラーを投稿してください。この場合、それは比較的単純な修正でしたが、これらのログは将来必要になる可能性があります。

編集

さらに、ChipCountオブジェクトにfile_contextパラメーターを渡すことはありません。それはfile_context nullあなたがそれを呼び出すときに作られますloadChips();

これを試して:

public class MainActivity extends Activity {

    ChipCount chips; // Don't initialize here, on second thought

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        chips = new ChipCount(this); // Initialize here; and pass it `this`, which is an Activity, and also a Context

        TextView number_of_chips = (TextView) findViewById(R.id.number_of_chips);
        int chip = chips.getChips();
        //number_of_chips.setText("500");
    }

}

次に、 のコンストラクターで、パラメーターをChipCount受け入れてから、 を実行します。Contextfile_context = newContext;

于 2012-10-02T02:44:42.620 に答える
1

を初期化したことがないChipCount chips;ため、呼び出されると null になり、NullPointerException.

コードに次のようなものが必要ChipCount chips = new ChipCount();です。

于 2012-10-02T02:44:26.880 に答える