应用程序崩溃而未捕获任何异常

时间:2019-03-25 17:18:33

标签: java android json

因此,我进入Udemy的“完整的Android N开发人员课程”教程,并尝试进行有关气象应用程序的第86讲。

我从https://openweathermap.org/current#cityid开始使用API​​,并使用JSON获取所需的数据。

当我输入正确的城市名称时,该应用程序正常运行,但是当输入错误或为空时,该应用程序崩溃而未捕获任何异常。

我不知道它为什么崩溃以及在哪里看。所以我给你我写的所有代码。我试图在这里和那里实施if语句来尝试找到它,但是没有任何运气。

我想知道问题出在哪里以及如何解决该问题,以使该应用程序不再崩溃。

谢谢。

public class MainActivity extends AppCompatActivity {

    EditText editText;
    String city = "";
    TextView textView;

    public void getWeather (View view)  {
        try {
            city = URLEncoder.encode(editText.getText().toString(), "UTF-8");

            if (editText.getText().toString() == "") {
                Toast.makeText(MainActivity.this, "Could not find weather", Toast.LENGTH_SHORT).show();
                textView.setText("Please enter a city.");
            } else  {
                DownloadTask task = new DownloadTask();
                task.execute("http://api.openweathermap.org/data/2.5/weather?q=" + city + "&appid=c6ef169a79d84674ef7e1414301eb5c4");
            }

            InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            mgr.hideSoftInputFromWindow(editText.getWindowToken(), 0);

        } catch (UnsupportedEncodingException e1) {
            Toast.makeText(MainActivity.this, "UnsupportedEncodingException", Toast.LENGTH_SHORT).show();
        }catch (Exception e) {
            Toast.makeText(MainActivity.this, "General exception (getWeather)", Toast.LENGTH_SHORT).show();
        }
    }


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

        @Override
        protected String doInBackground(String... urls) {

            String result = "";
            URL url;
            HttpURLConnection urlConnection = null;

            try {
                url = new URL(urls[0]);
                urlConnection = (HttpURLConnection)url.openConnection();
                InputStream in = null;
                in = urlConnection.getInputStream();
                InputStreamReader reader = new InputStreamReader(in);

                int data = reader.read();
                while (data != -1) {
                    char current = (char) data;
                    result += current;
                    data = reader.read();
                }
                return result;
            } catch (MalformedURLException e1) {
                Toast.makeText(MainActivity.this, "MalformedURLException", Toast.LENGTH_SHORT).show();
            } catch (IOException e2) {
            Toast.makeText(MainActivity.this, "IOException", Toast.LENGTH_SHORT).show();
            } catch (Exception e) {
                Toast.makeText(MainActivity.this, "General exception (doInBackground)", Toast.LENGTH_SHORT).show();
            }
            return null;
        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);

            try {
                String message = "";
                JSONObject jsonObject = null;
                jsonObject = new JSONObject(result);
                String weatherInfo = jsonObject.getString("weather");
                JSONArray jsonArray = new JSONArray(weatherInfo);

                for (int i = 0; i < jsonArray.length(); i++)    {

                    JSONObject jsonPart = jsonArray.getJSONObject(i);
                    String main = "";
                    String description = "";

                    main = jsonPart.getString("main");
                    description = jsonPart.getString("description");

                    if (main != "" && description != "")    {
                        message += main + ": " + description + "\r\n";
                    }
                }

                if (message != "") {
                    textView.setText(message);
                } else  {
                    Toast.makeText(MainActivity.this, "Could not find weather", Toast.LENGTH_SHORT).show();
                }
            } catch (JSONException e1) {
                Toast.makeText(MainActivity.this, "JSONException", Toast.LENGTH_SHORT).show();
            } catch (Exception e) {
                Toast.makeText(MainActivity.this, "General exception (onPostExecute)", Toast.LENGTH_SHORT).show();
            }
        }
    }

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

        editText = (EditText) findViewById(R.id.editText);
        textView = (TextView) findViewById(R.id.textView);

    }
}

1 个答案:

答案 0 :(得分:0)

这是因为您尝试使用以下行在doInBackground(Params...)AsyncTask方法内使用后台线程更改UI:

try {
     ...
    return result;
} catch (MalformedURLException e1) {
    Toast.makeText(MainActivity.this, "MalformedURLException", Toast.LENGTH_SHORT).show();
} catch (IOException e2) {
Toast.makeText(MainActivity.this, "IOException", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
    Toast.makeText(MainActivity.this, "General exception (doInBackground)", Toast.LENGTH_SHORT).show();
}

您不应在doInBackground(Params...)内致电Toast。在onPostExecute(Result)内进行操作。

您可以通过忽略错误或在doInBackground中返回特定文本来避免这种情况。像这样:

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

    @Override
    protected String doInBackground(String... urls) {

        String result = "";
        ...

        try {
            ...
            return result;
        } catch (MalformedURLException e1) {
            result= "MalformedURLException";
        } catch (IOException e2) {
            result= "IOException";
        } catch (Exception e) {
            // do nothing and returning empty
            result= "Exception";
        }
        return result;
    }

    @Override
    protected void onPostExecute(String result) {
        // check if there is an error
        String errorMessage = "";
        switch(result) {
          case "MalformedURLException":
            errorMessage = "MalformedURLException";
            break;
          case ""IOException":
            errorMessage = "IOException";
            break;
          case "Exception":
            errorMessage = "Exception";
            break;
        }

         // there is an error, show a message.
        if(!errorMessage.isEmpty()) {
            Toast.makeText(MainActivity.this, "Could not find weather: " + errorMessage, Toast.LENGTH_SHORT).show();
            return; // stop the process.
        }

         // do something when no error found.

    }
}