【问题标题】:java.lang.NullPointerException in JSONArray [duplicate]JSONArray 中的 java.lang.NullPointerException [重复]
【发布时间】:2017-03-28 00:29:24
【问题描述】:

在我的应用程序中,我想从数据库中显示我的位置,我找到了执行此操作的代码,但我收到了这个错误,所以请帮助我! '这是我的 MainnActivity'

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;
}
   }

'问题出在哪里 MarkerJSONParser.JAVA :'

package com.ry.rhcomptence.accessiblemaroc;

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

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class MarkerJSONParser {

/** Receives a JSONObject and returns a list */
public List<HashMap<String,String>> parse(JSONObject jObject){      

    JSONArray jMarkers =null;
    try {           
        /** Retrieves all the elements in the 'markers' array */
        jMarkers = jObject.getJSONArray("markers");
    } catch (JSONException e) {
        e.printStackTrace();
    }
    /** Invoking getMarkers with the array of json object
     * where each json object represent a marker
     */
    return getMarkers(jMarkers);
}


private List<HashMap<String, String>> getMarkers(JSONArray jMarkers){
    int markersCount = jMarkers.length();
    List<HashMap<String, String>> markersList = new ArrayList<HashMap<String,String>>();
    HashMap<String, String> marker = null;  

    /** Taking each marker, parses and adds to list object */
    for(int i=0; i<markersCount;i++){
        try {
            /** Call getMarker with marker JSON object to parse the marker */
            marker = getMarker((JSONObject)jMarkers.get(i));
            markersList.add(marker);
        }catch (JSONException e){
            e.printStackTrace();
        }
    }

    return markersList;
}

/** Parsing the Marker JSON object */
private HashMap<String, String> getMarker(JSONObject jMarker){

    HashMap<String, String> marker = new HashMap<String, String>();
    String lat = "-NA-";
    String lng ="-NA-";


    try {
        // Extracting latitude, if available
        if(!jMarker.isNull("lat")){
            lat = jMarker.getString("lat");
        }

        // Extracting longitude, if available
        if(!jMarker.isNull("lng")){
            lng = jMarker.getString("lng");
        }                   

        marker.put("lat", lat);
        marker.put("lng", lng);         

    } catch (JSONException e) {         
        e.printStackTrace();
    }       
    return marker;
}

}

'最后是 ERROR'

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) 

【问题讨论】:

  • 首先,使用 Jackson 或 GS​​ON[guides.codepath.com/android/leveraging-the-gson-library] 之类的东西来序列化和反序列化整个 JSON 对象。您正在做的事情太乏味和不必要,因为这是一个普遍解决的问题
  • 其次,停止使用 asynctasks 进行网络调用。开始使用更高级的网络库。 android-arsenal.com/tag/65 应该可以帮助您找到更多信息。我最喜欢的是改装。作为第 1 步,您走错了路。
  • 我只是初学者,我在网上找到了这段代码,并在我的项目中使用了它。所以如果你能帮我找到另一个代码
  • 如果需要从网络中获取数据,请搜索 gson + retrofit2。如果您只需要一个简单的存储解决方案,请查看领域。你会得到你的答案:)

标签: android arrays json dictionary nullpointerexception


【解决方案1】:

您没有尝试在 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);
        }
    }
}

你提到这是一个:

//Background thread to parse the JSON data retrieved from MySQL server

但是您并没有从 MySQL 服务器中检索数据,这反过来又不会给您任何回报。当您将任何内容传递给您的 MarkerJSONParser 并尝试解析任何内容时。这将导致 NullPointerException。

【讨论】:

    猜你喜欢
    • 2014-04-17
    • 1970-01-01
    • 1970-01-01
    • 2017-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    相关资源
    最近更新 更多