0

アプリケーションで Google マップを使用しています。Googleマップが正しくロードされたときに最初にクリックするとページにボタンがありますが、もう一度そのページに移動してそのボタンをクリックするとアプリがクラッシュします。

これは私のコードです:

public class GoogleMaps extends Activity {

    MapFragment googleMapFragment = null;
    プライベート スタティック GoogleMap googleMap = null;
    プライベート文字列プロバイダー。
    MarkerOptions マーカー;
    二重緯度、経度;
    プライベート LocationManager locationManager;
    ParseGeoPoint myLatLng[];
    int count_place, i = 0;

    @オーバーライド
    protected void onCreate(Bundle savedInstanceState) {
        // TODO 自動生成メソッド スタブ
        super.onCreate(savedInstanceState);
        setContentView(R.layout.googlemap_view);
        試す {
            初期化マップ();
            initParse();
        キャッチ(例外e){
            // TODO: 例外を処理する
            Toast.makeText(getApplicationContext(), e.toString(),
                    Toast.LENGTH_SHORT).show();
        }
    }

    プライベートボイドinitParse(){
        // TODO 自動生成メソッド スタブ
        Parse.initialize(これ、「キー」、「キー」);
        ParseObject plcobj = new ParseObject("詳細");
        getLatLong();
        ParseGeoPoint myGeoPiont = new ParseGeoPoint(緯度、経度);
        ParseGeoPoint userLocation = (ParseGeoPoint) plcobj.get("場所");
        最終的な ParseQuery クエリ = ParseQuery.getQuery("詳細");
        query.whereNear("場所", myGeoPiont);
        query.setLimit(10);
        query.whereWithinKilometers("場所", myGeoPiont, 10);
        query.findInBackground(新しい FindCallback() {

            @オーバーライド
            public void done(List objects, ParseException e) {
                // TODO 自動生成メソッド スタブ

                もし (e == null) {
                    イテレータ Itr = objects.iterator();
                    while (Itr.hasNext()) {
                        ParseObject plcObjNext = (ParseObject) Itr.next();
                        myLatLng[i] = plcObjNext.getParseGeoPoint("場所");
                        i++; // 76 行目

                    }
                }
            }
        });
    }

    プライベートボイドinitilizeMap() {
        if (googleMap == null) {
            googleMapFragment = ((MapFragment) getFragmentManager()
                    .findFragmentById(R.id.map));
            googleMap = googleMapFragment.getMap();
            googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);

            if (googleMap == null) {
                Toast.makeText(getApplicationContext(),
                        「申し訳ありません! マップを作成できません」、Toast.LENGTH_SHORT)
                        。見せる();
            }
            googleMap.setMyLocationEnabled(真);
            Log.e("マップ", "------EOC-------");
            // ロケーション マネージャーを取得する

        }
    }

    public void getLatLong() {
        GPSTracker gps = new GPSTracker(GoogleMaps.this);
        if (gps.canGetLocation()) {
            経度 = gps.getLongitude();
            緯度 = gps.getLatitude();
            Toast.makeText(getApplicationContext(), 経度 + " " + 緯度,
                    Toast.LENGTH_SHORT).show();
        } // ブール値の true/false を返します
        そうしないと {
            gps.showSettingsAlert();
        }
    }
}

これは私のログです:

10-18 13:37:24.219 E/AndroidRuntime(21624): 致命的な例外: メイン
10-18 13:37:24.219 E/AndroidRuntime(21624): java.lang.NullPointerException
10-18 13:37:24.219 E/AndroidRuntime(21624): com.example.restaurantfinder.GoogleMaps$1.done(GoogleMaps.java:76)
10-18 13:37:24.219 E/AndroidRuntime (21624): com.parse.FindCallback.internalDone (FindCallback.java:45) で
10-18 13:37:24.219 E/AndroidRuntime (21624): com.parse.FindCallback.internalDone (FindCallback.java:1) で
10-18 13:37:24.219 E/AndroidRuntime(21624): com.parse.Parse$6$1.run(Parse.java:888)
10-18 13:37:24.219 E/AndroidRuntime(21624): android.os.Handler.handleCallback(Handler.java:605)
10-18 13:37:24.219 E/AndroidRuntime(21624): android.os.Handler.dispatchMessage(Handler.java:92)
10-18 13:37:24.219 E/AndroidRuntime(21624): android.os.Looper.loop(Looper.java:137)
10-18 13:37:24.219 E/AndroidRuntime(21624): android.app.ActivityThread.main(ActivityThread.java:4517)
10-18 13:37:24.219 E/AndroidRuntime(21624): java.lang.reflect.Method.invokeNative(ネイティブメソッド)
10-18 13:37:24.219 E/AndroidRuntime(21624): java.lang.reflect.Method.invoke(Method.java:511)
10-18 13:37:24.219 E/AndroidRuntime(21624): com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993)
10-18 13:37:24.219 E/AndroidRuntime (21624): com.android.internal.os.ZygoteInit.main (ZygoteInit.java:760) で
10-18 13:37:24.219 E/AndroidRuntime(21624): dalvik.system.NativeStart.main(ネイティブメソッド)
4

2 に答える 2

0

あなたの問題は空の ParseGeoPoint 配列です。

コンパイラがParseGeoPoint myLatLng[];を参照すると、メモリのない空の配列へのポインタが作成されるため、 を介してメモリにアクセスしようとするとmyLatLng[i]、メモリが存在しないため null ポインタが返され、null ポインタに書き込むと NullPointerException がスローされるため、このような間違いに注意する必要があります。何も書き込まず、後でデータを保持したくないでしょう。C では、空の配列に書き込むと、例外をスローする代わりにメモリの別の部分を上書きし、バグを追跡するのが困難になる可能性があります。

配列に書き込む前に、適切なサイズで配列を初期化する必要があります。Java では、配列は、長さ 3 を使用する次の構文で固定長に初期化されます。

ParseGeoPoint myLatLng[] = new ParseGeoPoint[3];

ParseGeoPoint myLatLng[];または入力した後のいつかmyLatLng[] = new ParseGeoPoint[3];

あなたの場合:

myLatLng[] = new ParseGeoPoint[objects.size()];オブジェクトを反復処理して配列に書き込もうとする前に。NULL ポインタには書き込めません。どこを指し、どのくらいのスペースを割り当てるかをコンパイラに伝える必要があります。

ArrayList項目のリストを操作しているときに、 およびその他のListオブジェクトが役立つ場合があります。それらは、必要な場合に時間を節約できる便利なメソッドを多数提供し、固定長を必要としません。メモリが不足するまで、追加するにつれて増加するストレージを提供します。

ヌル ポインターをデバッグする方法を学ぶのに大いに役立ち、多くの時間を節約できます。これらは非常に一般的な例外であり、ほとんどの場合、null ポインターのデバッグは簡単です。

于 2020-10-29T22:41:09.703 に答える