簡體   English   中英

java.lang.RuntimeException:執行doInBackground()時發生錯誤

[英]java.lang.RuntimeException: An error occured while executing doInBackground()

我正在嘗試從URL獲取JSON代碼。
嘗試在瀏覽器中打開時,URL工作正常。
但是,當我運行該應用程序時,它崩潰並顯示以下日志:

11-11 21:06:30.489  25670-25695/app.com.example.android.popularmovies E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #1
Process: app.com.example.android.popularmovies, PID: 25670
java.lang.RuntimeException: An error occured while executing doInBackground()
        at android.os.AsyncTask$3.done(AsyncTask.java:300)
        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
        at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
        at java.util.concurrent.FutureTask.run(FutureTask.java:242)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
        at java.lang.Thread.run(Thread.java:841)
 Caused by: java.lang.NullPointerException
        at org.json.JSONTokener.nextCleanInternal(JSONTokener.java:116)
        at org.json.JSONTokener.nextValue(JSONTokener.java:94)
        at org.json.JSONObject.<init>(JSONObject.java:155)
        at org.json.JSONObject.<init>(JSONObject.java:172)
        at app.com.example.android.popularmovies.MainActivityFragment.getJSONResults(MainActivityFragment.java:137)
        at app.com.example.android.popularmovies.MainActivityFragment.getStringArrayFromJson(MainActivityFragment.java:94)
        at app.com.example.android.popularmovies.MainActivityFragment.access$1100(MainActivityFragment.java:30)
        at app.com.example.android.popularmovies.MainActivityFragment$FetchDataClass.doInBackground(MainActivityFragment.java:264)
        at app.com.example.android.popularmovies.MainActivityFragment$FetchDataClass.doInBackground(MainActivityFragment.java:249)
        at android.os.AsyncTask$2.call(AsyncTask.java:288)
        at java.util.concurrent.FutureTask.run(FutureTask.java:237)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:841)


這很奇怪,因為它正在運行,我不記得進行任何更改。
這是我的AsyncTask:

    public class FetchDataClass extends AsyncTask<String, Void, String[]>{
    private final String IMG_URL = "http://image.tmdb.org/t/p/w185/";
    private final String JSON_PATH_ITEM = "poster_path";

    @Override
    protected String[] doInBackground(String... params){
        Uri.Builder builder = new Uri.Builder();
        builder.scheme("http")
                .authority("api.themoviedb.org")
                .appendPath("3")
                .appendPath("discover")
                .appendPath("movie")
                .appendQueryParameter("sort_by", params[0])
                .appendQueryParameter("api_key", API_KEY);
        jsonCode = dataFetcher(builder);
        return getStringArrayFromJson(jsonCode, JSON_PATH_ITEM);
    }

    @Override
    protected void onPostExecute(String[] result){
        if(result != null){
            adapter.clear();
            for(String dataStr : result) {
                String imgURL = dataStr;
                if(dataStr != "null") {
                    imgURL = IMG_URL + dataStr;
                }
                adapter.add(imgURL);
            }
        }
    }
}

以及方法“ dataFecther”:

    private String dataFetcher(Uri.Builder uriBuilder){
    HttpURLConnection urlConnection = null;
    BufferedReader reader = null;

    String jsonDataStr = null;
    try{
        String myURL = uriBuilder.build().toString();
        URL url = new URL(myURL);
        urlConnection = (HttpURLConnection) url.openConnection();
        urlConnection.setRequestMethod("GET");
        try{
            urlConnection.connect();
        }catch (NullPointerException e){
            return null;
        }

        InputStream inputStream = urlConnection.getInputStream();
        StringBuffer buffer = new StringBuffer();

        if(inputStream == null){
            return null;
        }

        reader = new BufferedReader(new InputStreamReader(inputStream));

        if(buffer.length() == 0){
            return null;
        }
        jsonDataStr = buffer.toString();
    }catch (IOException e){
        return null;
    }finally {
        if(urlConnection == null){
            urlConnection.disconnect();
        }
        if(reader != null){
            try {
                reader.close();
            }catch (final IOException e){
                return null;
            }
        }
    }
    return jsonDataStr;
}


private String[] getStringArrayFromJson(String json, String name){
    int resultLength = getJSONResults(json).length();
    String[] strArray = new String[resultLength];

    for(int i = 0; i < resultLength; i++){
        strArray[i] = getStringFromJson(json, i, name);
    }

    return strArray;
}

private String getStringFromJson(String json, int index, String name){
    String jsonStr = null;
    try {
        jsonStr = getJSONResults(json)
                .getJSONObject(index)
                .getString(name);
    }catch (JSONException e){
        return null;
    }
    if(jsonStr == "null" && name != "poster_path"){
        jsonStr = "Not avaliable.";
    }
    return jsonStr;
}
    private JSONArray getJSONResults(String json){
    final String JSON_RESULTS = "results";
    JSONArray results = null;

    try {
        JSONObject jsonObject = new JSONObject(json);
        results = jsonObject.getJSONArray(JSON_RESULTS);
    }catch (JSONException e){
        return null;
    }
    return results;
}



有誰知道我該如何解決? 謝謝!

我認為這是方法dataFetcher()返回null。 你應該檢查一下。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM