1

null ポインター例外が発生する理由を見つける手助けが必要です。デバッグモードにしてみましたが、これが Eclipse と Android で動作する場合、使用方法がわかりません。最初の方法は、配列を初期化するためにファイルの行数をカウントすることです (これは時間の経過とともに変化します)。データは実際に setData() メソッドで設定されます。

public class ATS_BoxesActivity extends Activity {

private String iButtonID, iButtonName;
private String routeID, stopNum;
private String lat, lon;
private String[] dropBoxes;


public ATS_BoxesActivity() throws IOException{
    dropBoxes=new String[countLines()];

}
private int countLines() throws IOException{
BufferedReader(getResources().openRawResource(R.raw.spinner_data));
    int count=0;
    Scanner s = new Scanner(getAssets().open("spinner_data.csv"));
    while (s.hasNextLine()) {   //this is where the error is pointing       
        count++;
        s.nextLine();
    }

}

public String[] setData() throws IOException {

    Scanner s = new Scanner(getAssets().open("spinner_data.csv"));
    String line = "";
    int pointer = 0;
    while (s.hasNextLine()) {
        line=s.nextLine();
        StringTokenizer st = new StringTokenizer(line);
        iButtonID = (st.nextToken(","));
        iButtonName = (st.nextToken(","));
        routeID = (st.nextToken(","));
        stopNum = (st.nextToken());
        lat = (st.nextToken(","));
        // setLongitude(st.nextToken(","));
        System.out.println("DropBox: " + iButtonName);

        dropBoxes[pointer] = iButtonName;
        pointer += 1;           
    }
    return dropBoxes;
}

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);



    Spinner dropSpinner = (Spinner) findViewById(R.id.dbSpinner);
    ArrayAdapter<CharSequence> adapter = new ArrayAdapter<CharSequence>(
            this, android.R.layout.simple_spinner_item);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

    try {
        String[] db = setData();
        for (int i = 0; i < db.length; i++) {
            adapter.add(db[i]);
        }
        dropSpinner.setAdapter(adapter);
    } catch (IOException e) {
        e.printStackTrace();
    }

    Spinner fillSpinner = (Spinner) findViewById(R.id.fillSpinner);
    ArrayAdapter<CharSequence> adapter1 = ArrayAdapter.createFromResource(
            this, R.array.fill_array, android.R.layout.simple_spinner_item);
    adapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    fillSpinner.setAdapter(adapter1);
    fillSpinner.setOnItemSelectedListener(new MyOnItemSelectedListener());



}

}

4

3 に答える 3

0

ここで、NPE が で発生していると推測します。これはdropBoxes[pointer] = iButtonName;、この行dropBoxes=new String[countLines()];が実行されていないためです。引数のないコンストラクターは、Activity に対して実行されません。

dropBoxes=new String[countLines()];を呼び出す前に実行setData()してくださいonCreate()

于 2012-05-01T02:32:43.673 に答える
0
Scanner s = new Scanner(getAssets().open("spinner_data.csv"));

getAssets().open("spinner_data.csv")  //returning null

コンストラクター呼び出しが NullPointerException をスローしています。スキャナー コンストラクターに渡されるオブジェクトが Readable インターフェイスを実装していない場合、null ポインター例外がスローされます。そのため、open 関数呼び出しまたは getAssets は null を返す必要があり、null が関数に渡されます。

私は以下を読んだ、ここ

特に明記しない限り、null パラメーターを Scanner のメソッドに渡すと、NullPointerException がスローされます。

そして、次のコードは NullPointerException を生成します

public static void main(String[] args) {
    // TODO Auto-generated method stub
    Scanner s;
    InputStream is = null;
    s = new Scanner(is);
}


Exception in thread "main" java.lang.NullPointerException
    at java.io.Reader.<init>(Unknown Source)
    at java.io.InputStreamReader.<init>(Unknown Source)
    at java.util.Scanner.<init>(Unknown Source)
    at testing.main(testing.java:14)

spinner_data.csv 入力ストリームを InputStream オブジェクトに保存し、null かどうかを確認します。その場合、問題はファイル名またはファイルのプロパティにある可能性があります。それは読めますか?権限はありますか?

于 2012-05-01T02:34:41.037 に答える
0

デバッグは Eclipse と Android で間違いなく機能し、非常に役立つツールなので、よく知っておくことを強くお勧めします。

「logcat」ウィンドウを確認すると、null ポインターを取得している正確な行を示すスタック トレースが表示されるはずです。そこからまだわからない場合は、スタック トレースを貼り付けてください。ここの誰かが助けてくれるはずです。

Eclipse で logcat ウィンドウが見つからない場合は、[ウィンドウ] -> [ビューの表示] -> [その他] -> [Android] -> [Logcat] に移動します。

于 2012-05-01T01:54:32.553 に答える