Android JSONArray中的java.lang.NullPointerException

Android JSONArray中的java.lang.NullPointerException,android,arrays,json,dictionary,nullpointerexception,Android,Arrays,Json,Dictionary,Nullpointerexception,在我的应用程序中,我想从数据库中显示我的位置,我发现代码可以这样做,但我得到了这个错误,所以请帮助我!! “这是我的主要任务” package com.ry.rhcomptence.accessiblemaroc; import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.view.Menu; import com.

在我的应用程序中,我想从数据库中显示我的位置,我发现代码可以这样做,但我得到了这个错误,所以请帮助我!! “这是我的主要任务”

package com.ry.rhcomptence.accessiblemaroc;

import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.view.Menu;

import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.List;

public class MainnActivity extends FragmentActivity implements         OnMapReadyCallback {

GoogleMap mGoogleMap;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_mainn);

    // Getting reference to SupportMapFragment
    SupportMapFragment fragment = (SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.map);

    // Creating GoogleMap from SupportMapFragment
    //mGoogleMap = fragment.getMap();

    fragment.getMapAsync(this);


    // Setting OnClickEvent listener for the GoogleMap
    /**mGoogleMap.setOnMapClickListener(new OnMapClickListener() {
        @Override
        public void onMapClick(LatLng latlng) {
            addMarker(latlng);
            sendToServer(latlng);
        }
    });*/

    // Starting locations retrieve task
    new RetrieveTask().execute();

}

// Adding marker on the GoogleMaps
private void addMarker(LatLng latlng) {
    MarkerOptions markerOptions = new MarkerOptions();
    markerOptions.position(latlng);
    markerOptions.title(latlng.latitude + "," + latlng.longitude);
    mGoogleMap.addMarker(markerOptions);
}

// Invoking background thread to store the touched location in Remove MySQL server
private void sendToServer(LatLng latlng) {
    new SaveTask().execute(latlng);
}

@Override
public void onMapReady(GoogleMap googleMap) {
    // Enabling MyLocation button for the Google Map
    /**if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        // TODO: Consider calling
        //    ActivityCompat#requestPermissions
        // here to request the missing permissions, and then overriding
        //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
        //                                          int[] grantResults)
        // to handle the case where the user grants the permission. See the documentation
        // for ActivityCompat#requestPermissions for more details.
        return;
    }
    mGoogleMap.setMyLocationEnabled(true);*/


}


// Background thread to save the location in remove MySQL server
private class SaveTask extends AsyncTask<LatLng, Void, Void> {
    @Override
    protected Void doInBackground(LatLng... params) {
        String lat = Double.toString(params[0].latitude);
        String lng = Double.toString(params[0].longitude);
        String strUrl = "https://accessiblemaroc.000webhostapp.com/save.php";
        URL url = null;
        try {
            url = new URL(strUrl);

            HttpURLConnection connection = (HttpURLConnection) url
                    .openConnection();
            connection.setRequestMethod("POST");
            connection.setDoOutput(true);
            OutputStreamWriter outputStreamWriter = new OutputStreamWriter(
                    connection.getOutputStream());

            outputStreamWriter.write("lat=" + lat + "&lng="+lng);               
            outputStreamWriter.flush();
            outputStreamWriter.close();

            InputStream iStream = connection.getInputStream();
            BufferedReader reader = new BufferedReader(new
            InputStreamReader(iStream));

            StringBuffer sb = new StringBuffer();

            String line = "";

            while( (line = reader.readLine()) != null){
                sb.append(line);
            }

            reader.close();
            iStream.close();


        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;
    }

}

// Background task to retrieve locations from remote mysql server
private class RetrieveTask extends AsyncTask<Void, Void, String>{

    @Override
    protected String doInBackground(Void... params) {
        String strUrl = "https://accessiblemaroc.000webhostapp.com/retrieve.php";
        URL url = null;
        StringBuffer sb = new StringBuffer();
        try {
            url = new URL(strUrl);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.connect();
            InputStream iStream = connection.getInputStream();              
            BufferedReader reader = new BufferedReader(new InputStreamReader(iStream));         
            String line = "";               
            while( (line = reader.readLine()) != null){
                sb.append(line);
            }

            reader.close();
            iStream.close();                            

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }       
        return sb.toString();
    }

    @Override
    protected void onPostExecute(String result) {           
        super.onPostExecute(result);
        new ParserTask().execute(result);
    }

}

// Background thread to parse the JSON data retrieved from MySQL server
private class ParserTask extends AsyncTask<String, Void, List<HashMap<String, String>>>{
    @Override
    protected List<HashMap<String,String>> doInBackground(String... params) {
        MarkerJSONParser markerParser = new MarkerJSONParser();
        JSONObject json = null;
        try {
            json = new JSONObject(params[0]);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        List<HashMap<String, String>> markersList = markerParser.parse(json);
        return markersList;
    }

    @Override
    protected void onPostExecute(List<HashMap<String, String>> result) {
        for(int i=0; i<result.size();i++){
            HashMap<String, String> marker = result.get(i);
            LatLng latlng = new LatLng(Double.parseDouble(marker.get("lat")), Double.parseDouble(marker.get("lng")));
            addMarker(latlng);
        }
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}
   }

您没有试图在ParserTask中获取数据

 private class ParserTask extends AsyncTask<String, Void, List<HashMap<String, String>>>{
    @Override
    protected List<HashMap<String,String>> doInBackground(String... params) {
        MarkerJSONParser markerParser = new MarkerJSONParser();
        JSONObject json = null;
        try {
            json = new JSONObject(params[0]);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        List<HashMap<String, String>> markersList = markerParser.parse(json);
        return markersList;
    }

    @Override
    protected void onPostExecute(List<HashMap<String, String>> result) {
        for(int i=0; i<result.size();i++){
            HashMap<String, String> marker = result.get(i);
            LatLng latlng = new LatLng(Double.parseDouble(marker.get("lat")), Double.parseDouble(marker.get("lng")));
            addMarker(latlng);
        }
    }
}

但是,您并没有从MySQL服务器检索数据,而MySQL服务器不会给您任何信息。当您将该nothing传递给MarkerJSONParser并尝试不解析任何内容时。这将导致NullPointerException。

首先,使用类似Jackson或GSON的东西[对整个JSON对象进行序列化和反序列化。您所做的工作太单调且没有必要,因为这是一个普遍解决的问题。其次,停止使用asynctasks进行网络调用。开始使用更高级的网络库。应该可以帮助您找到更多。我最喜欢的是改装。您作为一个s,走错了路步骤1.我只是一个初学者,这段代码我在网上找到,并在我的项目中使用过。因此,如果您需要从网络获取数据,请帮助我找到另一段代码搜索gson+2。如果您只需要一个简单的存储解决方案,请查看领域。您将得到答案:)
E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #2
              java.lang.RuntimeException: An error occured while executing doInBackground()
                  at android.os.AsyncTask$3.done(AsyncTask.java:299)
                  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
                  at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
                  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
                  at java.util.concurrent.FutureTask.run(FutureTask.java:137)
                  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
                  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
                  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
                  at java.lang.Thread.run(Thread.java:856)
               Caused by: java.lang.NullPointerException
                  at com.ry.rhcomptence.accessiblemaroc.MarkerJSONParser.parse(MarkerJSONParser.java:19)
                  at com.ry.rhcomptence.accessiblemaroc.MainnActivity$ParserTask.doInBackground(MainnActivity.java:191)
                  at com.ry.rhcomptence.accessiblemaroc.MainnActivity$ParserTask.doInBackground(MainnActivity.java:181)
                  at android.os.AsyncTask$2.call(AsyncTask.java:287)
                  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
                  at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
                  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
                  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
                  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
                  at java.lang.Thread.run(Thread.java:856) 
 private class ParserTask extends AsyncTask<String, Void, List<HashMap<String, String>>>{
    @Override
    protected List<HashMap<String,String>> doInBackground(String... params) {
        MarkerJSONParser markerParser = new MarkerJSONParser();
        JSONObject json = null;
        try {
            json = new JSONObject(params[0]);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        List<HashMap<String, String>> markersList = markerParser.parse(json);
        return markersList;
    }

    @Override
    protected void onPostExecute(List<HashMap<String, String>> result) {
        for(int i=0; i<result.size();i++){
            HashMap<String, String> marker = result.get(i);
            LatLng latlng = new LatLng(Double.parseDouble(marker.get("lat")), Double.parseDouble(marker.get("lng")));
            addMarker(latlng);
        }
    }
}
//Background thread to parse the JSON data retrieved from MySQL server