2015-10-16 67 views
1

嘗試在空對象上調用虛方法'void java.io.BufferedReader.close()'引用此例外是拋出由JRE請幫助!嘗試在空對象上調用虛方法'void java.io.BufferedReader.close()'參考

這裏是類

package com.example.MovieMania.fragmentTv; 


import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.net.HttpURLConnection; 
import java.net.URL; 

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





import com.example.MovieMania.R; 

import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.os.AsyncTask; 
import android.util.Log; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.GridView; 
import android.widget.AdapterView.OnItemClickListener; 

public class BackgroundTaskTv extends AsyncTask<String, Void, String[]> { 

    final String DEF_BASE_URL = "http:api.themoviedb.org/3/tv/popular?[api_key]"; 

    private final Context context; 

    public BackgroundTaskTv(Context context) { 
     this.context = context; 
    } 

    public static String JsonStr; // so that JSONstring can be used by other activities 

    private String[] jsonParse(String movieJsonStr) throws JSONException { 

     final String POSTER_PATH = "poster_path"; // JSON STRING PARSING AND 
                // RETURN 
                // POSTER PATHS 

     JSONObject jsonObj = new JSONObject(movieJsonStr); 
     JSONArray resultArray = jsonObj.getJSONArray("results"); 

     int len =resultArray.length(); 
     String[] posters = new String[len]; 
     for (int i = 0; i < len; i++) { 
      posters[i] = resultArray.getJSONObject(i).getString(POSTER_PATH); 
     } 

     for (String res : posters) 
      Log.v(POSTER_PATH, res); 

     return posters; 

    } 

    @Override 
    protected String[] doInBackground(String... params) { 



     String movieJsonStr = null; 
     InputStream inputStream = null; 


     String FINAL_URL=DEF_BASE_URL; 
     ImageAdapterTv.poster_paths.clear(); 

     BufferedReader reader = null; 
     HttpURLConnection urlConnection = null; // READ THE INPUTSTREAM AND 
               // GET THE JSONSTRING 
     try { 
      URL url = new URL(FINAL_URL); 
      urlConnection = (HttpURLConnection) url.openConnection(); 
      urlConnection.setRequestMethod("GET"); 
      urlConnection.connect(); 

      // Read the input stream into a String 
      inputStream = urlConnection.getInputStream(); 
      StringBuffer buffer = new StringBuffer(); 
      if (inputStream == null) { 
       // Nothing to do. 
       return null; 
      } 

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

      String line; 
      while ((line = reader.readLine()) != null) { 
       // Since it's JSON, adding a newline isn't necessary (it 
       // won't affect parsing) 
       // But it does make debugging a *lot* easier if you print 
       // out the completed 
       // buffer for debugging. 
       buffer.append(line + "\n"); 
      } 

      if (buffer.length() == 0) { 
       // Stream was empty. No point in parsing. 
       return null; 
      } 

      movieJsonStr = buffer.toString(); 
      JsonStr=movieJsonStr; 

      Log.v("Tv string: ", movieJsonStr); 
     } catch (Throwable e) { 
      Log.e("backgroundtask", "EXCEPTION", e); 
     } finally { 
      urlConnection.disconnect(); 
      try { 
       reader.close(); 
       inputStream.close(); 
      } catch (IOException e) { 
       Log.e("READER.CLOSE()", e.toString()); 
      } 
     } 

     try { 
      return jsonParse(movieJsonStr); 
     } catch (JSONException e) { 
      Log.e("BACKGROUNDTASK", "EXCEPTION FROM jsonParse()", e); 
     } 

     return null; 
    } 

    @Override 
    protected void onPostExecute(String[] result) { 
     if (ImageAdapterTv.poster_paths.isEmpty()) { 
      for (String s : result) { 
       ImageAdapterTv.poster_paths.add(s); 
      } 
     } 

     final Activity activity = (Activity) context; 
     activity.runOnUiThread(new Runnable() { 
      @Override 
      // this code is written so that the grid view is populated after 
      // backgroundTask 
      public void run() { // produce results so that there is no blank 
           // screen on launch 
       GridView grid = (GridView) activity.findViewById(R.id.gridview_tv); 
       grid.setAdapter(new ImageAdapterTv(context)); 

       grid.setOnItemClickListener(new OnItemClickListener() { 
        @Override 
        public void onItemClick(AdapterView<?> parent, View view, 
          int position, long id) { 
         String path=ImageAdapterTv.poster_paths.get(position); 
         Intent intent=new Intent(context,DetailActivityTv.class); 
         intent.putExtra("poster", path); 
         intent.putExtra("POSITION", position); 
         activity.startActivity(intent); 
         } 
       }); 

       } 
     }); 
    } 

} 

這是這是越來越從一個API 我不知道爲什麼這個異常被拋出JSON響應後臺線程。

+0

爲什麼不移除圍繞BufferedReader初始化的try catch,並查看它的崩潰。 –

回答

3

如果異常初始化在讀者面前發生就會導致這個錯誤,因爲閱讀器.close()放在finally塊中。這是很好的做法,終於

if(reader != null) 
    reader.close(); 
if(inputStream != null) 
    inputStream.close(); 
+0

感謝它的工作,但現在它引發了另一個異常引起:java.lang.NullPointerException:試圖調用虛擬方法'int java.lang.String.length()'在一個空對象引用我現在做什麼? –

+0

這不是一個好方法。你應該檢查null,是的。但在此之前,請檢查你爲什麼變爲空。 –

1

你需要檢查最後的「空」。發生了一些事情,而讀者沒有創建。

  try { 
       if (reader != null) reader.close(); 
       if (inputStream!= null) inputStream.close(); 
      } catch (IOException e) { 
       Log.e("READER.CLOSE()", e.toString()); 
      } 

你做return null,但最後完成。並在其中BufferedReader reader = null;。見例如

public static void main(String[] args){ 
    System.out.println(0); 
    Object o = get(); 
    System.out.println(2); 
} 

public static Object get(){ 
    try { 
     System.out.println(1); 
     return null; 
    } catch (Exception e){ 

    } finally { 
     System.out.println("finally"); 
    } 
    return null; 
} 

輸出:

終於
+0

感謝它的工作,但現在它拋出了另一個異常引起:java.lang.NullPointerException:試圖調用虛擬方法'int java.lang.String.length()'null對象引用我現在做什麼? –

+0

我回答了第一個問題,並且您選擇了正確的答案。大聲笑。可怕的世界......在我看來,你不明白最終如何工作。它總是令人滿意。 – user2413972

1

關閉資源之前總是檢查空它也許造成的,因爲在你的URLConnection異常或您的InputStream爲null。

if (inputStream == null) 
return null; 

如果拋出異常或從inputstream空值檢查調用返回值,您的代碼將最終阻塞。

從不創建使用inputstream創建的讀取器對象。所以當你嘗試close()方法時,它會拋出空指針異常。

在流和讀者,作者使用close()方法之前,您應該始終使用空檢查。

+0

感謝它的工作,但現在它拋出另一個異常引起:java.lang.NullPointerException:嘗試調用空對象引用虛擬方法'int java.lang.String.length()'現在我該怎麼做? –

+0

我無法找到您想要在後臺任務中訪問字符串長度的位置。異常可能導致在應用程序的其他部分。 – Sudheer

1

因爲它是從詳細描述可見,當你試圖關閉BufferedReader reader對象在finally塊,因爲它是null在那一刻出現異常。發生這種情況是因爲在初始化讀取器之前或因爲調用return語句而導致try塊中出現其他異常,Ë某處這段代碼:

 URL url = new URL(FINAL_URL); 
     urlConnection = (HttpURLConnection) url.openConnection(); 
     urlConnection.setRequestMethod("GET"); 
     urlConnection.connect(); 

     // Read the input stream into a String 
     inputStream = urlConnection.getInputStream(); 
     StringBuffer buffer = new StringBuffer(); 
     if (inputStream == null) { 
      // Nothing to do. 
      return null; 
     } 

爲了避免這種情況,你應該檢查你的nullreaderinputStream封似在此之前:

if(reader != null) { 
    reader.close; 
    reader = null; 
} 
if(inputStream != null) { 
    inputStream.close; 
    inputStream = null; 
} 

除了看看這篇文章關於捕Throwables: Is it a bad practice to catch Throwable?

無論如何,我想你應該知道爲什麼這個流程發生,因爲它不是你想要的,只要我能理解第二

爲什麼你感動的代碼塊的第一try-catch外:

try { 
     return jsonParse(movieJsonStr); 
    } catch (JSONException e) { 
     Log.e("BACKGROUNDTASK", "EXCEPTION FROM jsonParse()", e); 
    } 

您可以從一個try{}趕上多種類型的異常,你只需要指定逐一。 如上所述,當出現錯誤(並且確實如此)時,在創建讀取器之前以及之後的所有內容之前,您正在完成之前的try-catch塊。因此在這個地方你的movieJsonStr也是null,並且你正在向前傳遞它以創建一個JSONOblect。這是您的下一個異常來自哪裏。將return jsonParse(movieJsonStr);字符串移到您確定它是您要處理的字符串的位置。

相關問題