1


コードのどこが悪いのかを特定するのに苦労しているので、私は第二の目から助けをもらいたいと思っています。Eclipse IDEで、資産フォルダー( /assets/mmsi.txt)内のファイルから船のMMSIコードを読み取り、それぞれの場所にマップマーカーを追加

するGoogleマップアクティビティを実装しようとしています。クラスを使用してこのファイルから読み取ることはできますが、関数を使用して結果の行をdoubleに変換する際に問題が発生します。BufferedReaderStringDouble.parseDouble

LogCatは、次の問題を検出します。

01-23 17:59:11.672: E/AndroidRuntime(18242): FATAL EXCEPTION: main
01-23 17:59:11.672: E/AndroidRuntime(18242): java.lang.RuntimeException: Unable to resume activity {com.aquamet.saramap/com.aquamet.saramap.MainActivity}: java.lang.NullPointerException
01-23 17:59:11.672: E/AndroidRuntime(18242):    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3128)
01-23 17:59:11.672: E/AndroidRuntime(18242):    at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3143)
01-23 17:59:11.672: E/AndroidRuntime(18242):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2684)
01-23 17:59:11.672: E/AndroidRuntime(18242):    at android.app.ActivityThread.access$2300(ActivityThread.java:125)
01-23 17:59:11.672: E/AndroidRuntime(18242):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
01-23 17:59:11.672: E/AndroidRuntime(18242):    at android.os.Handler.dispatchMessage(Handler.java:99)
01-23 17:59:11.672: E/AndroidRuntime(18242):    at android.os.Looper.loop(Looper.java:123)
01-23 17:59:11.672: E/AndroidRuntime(18242):    at android.app.ActivityThread.main(ActivityThread.java:4627)
01-23 17:59:11.672: E/AndroidRuntime(18242):    at java.lang.reflect.Method.invokeNative(Native Method)
01-23 17:59:11.672: E/AndroidRuntime(18242):    at java.lang.reflect.Method.invoke(Method.java:521)
01-23 17:59:11.672: E/AndroidRuntime(18242):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:876)
01-23 17:59:11.672: E/AndroidRuntime(18242):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:634)
01-23 17:59:11.672: E/AndroidRuntime(18242):    at dalvik.system.NativeStart.main(Native Method)
01-23 17:59:11.672: E/AndroidRuntime(18242): Caused by: java.lang.NullPointerException
01-23 17:59:11.672: E/AndroidRuntime(18242):    at com.aquamet.saramap.MainActivity.getMMSI(MainActivity.java:173)
01-23 17:59:11.672: E/AndroidRuntime(18242):    at com.aquamet.saramap.MainActivity.setupRegion(MainActivity.java:136)
01-23 17:59:11.672: E/AndroidRuntime(18242):    at com.aquamet.saramap.MainActivity.onResume(MainActivity.java:82)
01-23 17:59:11.672: E/AndroidRuntime(18242):    at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1149)
01-23 17:59:11.672: E/AndroidRuntime(18242):    at android.app.Activity.performResume(Activity.java:3827)
01-23 17:59:11.672: E/AndroidRuntime(18242):    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3118)
01-23 17:59:11.672: E/AndroidRuntime(18242):    ... 12 more

つまり、次のコードにNullPointerExceptionがあるようです。

private double[] getMMSI() throws IOException {
        AssetManager am = this.getAssets();
        double[] mmsi = null;
        BufferedReader br = null;

        try {
            InputStream  file_stream = am.open("mmsi.txt");
            br = new BufferedReader(new InputStreamReader(file_stream));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        String line;
        for (int i=0; (line = br.readLine()) != null; i++) {
                // Following line seems to be the problem (line 173).
                mmsi[i] = Double.parseDouble(line);
        }

        try {
            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
}

しかし、デバッグ中、変数lineは実際にはnullではありません!(画像のREPが足りません) デバッグのスクリーンショット

別のSOユーザーも同様の問題を抱えていましたが、彼の変数は正しく初期化されていないようでした。 parseDoubleが私のコードでNullポインターをスローします[クローズ]

4

3 に答える 3

12

Double.parseDouble問題ではありません。あなたの割り当ては次のとおりです。

double[] mmsi = null;
...
// mssi is still null...
mmsi[i] = Double.parseDouble(line);

null以外の値をに割り当てることは決してないためmmsi、それに書き込もうとするとエラーが発生します。これをさらに証明する必要がある場合は、コードを次のように分割します。

double tmp = Double.parseDouble(line);
mmsi[i] = tmp;

例外が最初の行ではなく、 2番目の行で発生していることがわかります。

必要な行数がわからない場合は、ArrayList代わりに次の行を使用することをお勧めします。

List<Double> mmsi = new ArrayList<Double>();
...
mmsi.add(Double.valueOf(line));

編集:さらに、ファイルをfinallyブロックで閉じる必要があります。現在、読み取り中に例外がスローされた場合は、ファイルを開いたままにしておきます。また、現在のcatchブロック実装は、例外をスローさせるだけのIMOほど有用ではありません。

于 2013-01-23T20:19:54.897 に答える
2

問題は次のとおりです。double[] mmsi = null;

アレイを作成していません。

試す:

double[] mmsi = new double[10]; // or your desired array size

配列の詳細: Java の配列

于 2013-01-23T20:23:32.593 に答える
1

double の配列 mmsi は、null 参照以外のものを参照するように初期化されることはありません。したがって、NPE

 double[] mmsi = null;
于 2013-01-23T20:24:06.640 に答える