在HTTPURLConnection连接之后,代码最终会跳过

时间:2016-03-06 16:43:11

标签: java android

我尝试通过Google Udacity课程创建电影应用来学习Android开发。在下面的代码中执行urlConnection.connect()时,代码会自动转到finally块而不会出现任何错误/异常。

你能帮我看看我的代码有什么问题吗?谢谢!

    public class FetchMoviesTask extends AsyncTask<Void, Void, String> {

    private final String LOG_TAG = FetchMoviesTask.class.getSimpleName();

    protected String doInBackground(Void... params) {

        String JSONResponse = null;

        //These are declared outside as they'll be used in both try and finally  blocks
        BufferedReader reader = null;
        HttpURLConnection urlConnection = null;

        try {

            //construct your URL from a URI
            Uri.Builder URIbuilder = new Uri.Builder();
            URIbuilder.scheme("http")
                    .authority("api.themoviedb.org")
                    .appendPath("3")
                    .appendPath("movie")
                    .appendPath("popular")
                    .appendQueryParameter("api_key", BuildConfig.TMDB_API_KEY);

            //instantiate URL
            URL popularURL = new URL(URIbuilder.toString());

            Log.v(LOG_TAG, "Built URL: " + popularURL.toString());

            //create and open HTTP connection
            urlConnection = (HttpURLConnection) popularURL.openConnection();
            urlConnection.setRequestMethod("GET");
            urlConnection.connect();

            //InputStream is needed to read the response
            //http://developer.android.com/reference/java/net/HttpURLConnection.html
            InputStream inputStream = urlConnection.getInputStream();
            if (inputStream == null) {
                Log.e(LOG_TAG, "Null input stream");
                return null; //no data returned from HTTP request
            }

            //!!want to see what InputStream looks like
            Log.v(LOG_TAG, "inputStream.toString(): " + inputStream.toString());

            //BufferedReader is used to wrap a Reader and buffer its input
            //to read InputStream, a "reader" is required and that's InputStreamReader (duh)
            //http://developer.android.com/reference/java/io/BufferedReader.html
            reader = new BufferedReader(new InputStreamReader(inputStream));

            //!!want to see what BufferedReader looks like
            Log.v(LOG_TAG, "reader.toString(): " + reader.toString());

            //replaced StringBuffer w/ StringBuilder. will it work?
            StringBuilder builder = new StringBuilder();
            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.
                builder.append(line + "\n");
            }

            if (builder.length() == 0) return null; //empty stream. no point in parsing

            JSONResponse = builder.toString();

            Log.v(LOG_TAG, "JSON Response: " + JSONResponse);

            return parseJSON(JSONResponse);

        } catch (IOException e) {
            Log.e(LOG_TAG, "Error", e);
            return null;
        } catch (JSONException e) {
            Log.e(LOG_TAG, "Error parsing JSON", e);
            return null;
        } catch (Error e) {
            Log.e(LOG_TAG, "Unknown error", e);
        } finally {
            if (urlConnection != null) urlConnection.disconnect();
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e) {
                    Log.e(LOG_TAG, "Error closing stream", e);
                }
            }

            //will only be triggered if there's an error getting/parsing data
            return null;
        }

    }

2 个答案:

答案 0 :(得分:0)

CommonsWare向我指出了问题的可能原因,即缺少INTERNET许可。添加它解决了我的问题。感谢所有回复!

答案 1 :(得分:-2)

问题在于您的代码中的注释:

//will only be triggered if there's an error getting/parsing data

那是假的。

  

如果定义了finally块,则不会忽略try块中的返回,只有当finally块也包含返回时才会被忽略。

换句话说,如果tryfinally中都有“返回”,finally内的那个就会被执行。

来源:Java try-finally return design question

修改
您可能需要查看此内容:Does finally always execute in Java?