【问题标题】:Java - Catch an exception from async methodJava - 从异步方法中捕获异常
【发布时间】:2015-10-14 04:24:09
【问题描述】:

我正在通过 CEP(代码地址/邮政编码)进行搜索,为了进行搜索,我使用了第三方 api(postmon)。

每次我使用无效的邮政编码调用 api 时,应用程序都会崩溃并关闭。我试图捕获异常并返回它没有成功。可以帮助我了解我要去哪里错了吗?是这个方法的类型?

        //Criar evento do botão
    btnBuscaCEP.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            //abre thread em background
            new HttpRequestTask().execute();
        }
    });

}

private class HttpRequestTask extends AsyncTask<Void, Void, DAOPostmon> {
    String charCepTrim = char_CEP.getText().toString().trim();
    final String url = "http://api.postmon.com.br/v1/cep/"+charCepTrim;
    RestTemplate restTemplate = new RestTemplate();


    @Override
    protected DAOPostmon doInBackground(Void... params) {
        try {
            restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
            DAOPostmon DAOPostmon = restTemplate.getForObject(url, DAOPostmon.class);
            return DAOPostmon;
        } catch (Exception e) {
            return e.printStackTrace();
        }
    }

    @Override
    protected void onPostExecute(DAOPostmon DAOPostmon) {

        //quando a tag Logradouro estiver disponiivel no retorno da api rest
        if (DAOPostmon.getLogradouro() == null) {

            TextView greetingEndereco = (TextView) findViewById(R.id.inputLogradouro);
            TextView greetingBairro = (TextView) findViewById(R.id.inputBairro);
            TextView greetingCidade = (TextView) findViewById(R.id.inputCidade);
            TextView greetingEstado = (TextView) findViewById(R.id.inputEstado);
            TextView greetingCEP = (TextView) findViewById(R.id.inputCEP);
            greetingEndereco.setText(DAOPostmon.getEndereco().toUpperCase());
            greetingCidade.setText(DAOPostmon.getCidade().toUpperCase());
            greetingBairro.setText(DAOPostmon.getBairro().toUpperCase());
            greetingEstado.setText(DAOPostmon.getEstado().toUpperCase());
            greetingCEP.setText(DAOPostmon.getCep());
            String endereco = char_Logradouro.getText().toString();
            BuscaGeolocalizacao localizacaoEnd = new BuscaGeolocalizacao();
            localizacaoEnd.getAddressFromLocation(endereco,
                    getApplicationContext(), new GeocoderHandler());

        } else {

            //senão, quando não tiver a tag logradouro, usar endereco

            TextView greetingLogradouro = (TextView) findViewById(R.id.inputLogradouro);
            TextView greetingBairro = (TextView) findViewById(R.id.inputBairro);
            TextView greetingCidade = (TextView) findViewById(R.id.inputCidade);
            TextView greetingEstado = (TextView) findViewById(R.id.inputEstado);
            TextView greetingCEP = (TextView) findViewById(R.id.inputCEP);
            greetingLogradouro.setText(DAOPostmon.getLogradouro().toUpperCase());
            greetingCidade.setText(DAOPostmon.getCidade().toUpperCase());
            greetingBairro.setText(DAOPostmon.getBairro().toUpperCase());
            greetingEstado.setText(DAOPostmon.getEstado().toUpperCase());
            greetingCEP.setText(DAOPostmon.getCep());
            String endereco = char_Logradouro.getText().toString();
            BuscaGeolocalizacao localizacaoEnd = new BuscaGeolocalizacao();
            localizacaoEnd.getAddressFromLocation(endereco,
                    getApplicationContext(), new GeocoderHandler());

        }
    }
}

还有一个例外,当我用错误的邮政编码调用它时。

10-14 01:19:16.786 29926-29939/com.clubee.doggywalker W/艺术:暂停所有线程耗时:31.097 毫秒 10-14 01:19:19.767 29926-29939/com.clubee.doggywalker W/艺术:暂停所有线程耗时:11.260ms 10-14 01:19:19.770 29926-29995/com.clubee.doggywalker W/RestTemplate:对“http://api.postmon.com.br/v1/cep/34575235”的 GET 请求导致 404(CEP 34575235 nao encontrado);调用错误处理程序 10-14 01:19:19.856 29926-29995/com.clubee.doggywalker W/RestTemplate:对“http://api.postmon.com.br/v1/cep/34575235”的 GET 请求导致 404(CEP 34575235 nao encontrado);调用错误处理程序 10-14 01:19:19.868 29926-29995/com.clubee.doggywalker E/AndroidRuntime: 致命异常: AsyncTask #4 10-14 01:19:19.868 29926-29995/com.clubee.doggywalker E/AndroidRuntime: 进程: com.clubee.doggywalker, PID: 29926 10-14 01:19:19.868 29926-29995/com.clubee.doggywalker E/AndroidRuntime: java.lang.RuntimeException: 执行 doInBackground() 时出错 10-14 01:19:19.868 29926-29995/com.clubee.doggywalker E/AndroidRuntime: 在 android.os.AsyncTask$3.done(AsyncTask.java:304) 10-14 01:19:19.868 29926-29995/com.clubee.doggywalker E/AndroidRuntime: 在 java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) 10-14 01:19:19.868 29926-29995/com.clubee.doggywalker E/AndroidRuntime: 在 java.util.concurrent.FutureTask.setException(FutureTask.java:222) 10-14 01:19:19.868 29926-29995/com.clubee.doggywalker E/AndroidRuntime: 在 java.util.concurrent.FutureTask.run(FutureTask.java:242) 10-14 01:19:19.868 29926-29995/com.clubee.doggywalker E/AndroidRuntime: 在 android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 10-14 01:19:19.868 29926-29995/com.clubee.doggywalker E/AndroidRuntime: 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 10-14 01:19:19.868 29926-29995/com.clubee.doggywalker E/AndroidRuntime: 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 10-14 01:19:19.868 29926-29995/com.clubee.doggywalker E/AndroidRuntime: 在 java.lang.Thread.run(Thread.java:818) 10-14 01:19:19.868 29926-29995/com.clubee.doggywalker E/AndroidRuntime: 由: org.springframework.web.client.HttpClientErrorException: 404 CEP 34575235 nao encontrado 引起 10-14 01:19:19.868 29926-29995/com.clubee.doggywalker E/AndroidRuntime: 在 org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:76) 10-14 01:19:19.868 29926-29995/com.clubee.doggywalker E/AndroidRuntime: 在 org.springframework.web.client.RestTemplate.handleResponseError(RestTemplate.java:524) 10-14 01:19:19.868 29926-29995/com.clubee.doggywalker E/AndroidRuntime: 在 org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:481) 10-14 01:19:19.868 29926-29995/com.clubee.doggywalker E/AndroidRuntime: 在 org.springframework.web.client.RestTemplate.execute(RestTemplate.java:439) 10-14 01:19:19.868 29926-29995/com.clubee.doggywalker E/AndroidRuntime: 在 org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:237) 10-14 01:19:19.868 29926-29995/com.clubee.doggywalker E/AndroidRuntime: 在 com.clubee.doggywalker.DoggieWalker$HttpRequestTask.doInBackground(DoggieWalker.java:150) 10-14 01:19:19.868 29926-29995/com.clubee.doggywalker E/AndroidRuntime: 在 com.clubee.doggywalker.DoggieWalker$HttpRequestTask.doInBackground(DoggieWalker.java:137) 10-14 01:19:19.868 29926-29995/com.clubee.doggywalker E/AndroidRuntime: 在 android.os.AsyncTask$2.call(AsyncTask.java:292) 10-14 01:19:19.868 29926-29995/com.clubee.doggywalker E/AndroidRuntime: 在 java.util.concurrent.FutureTask.run(FutureTask.java:237) 10-14 01:19:19.868 29926-29995/com.clubee.doggywalker E/AndroidRuntime: 在 android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 10-14 01:19:19.868 29926-29995/com.clubee.doggywalker E/AndroidRuntime: 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 10-14 01:19:19.868 29926-29995/com.clubee.doggywalker E/AndroidRuntime: 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 10-14 01:19:19.868 29926-29995/com.clubee.doggywalker E/AndroidRuntime: 在 java.lang.Thread.run(Thread.java:818) 10-14 01:19:20.059 29926-29926/com.clubee.doggywalker I/Timeline: Timeline: Activity_idle id: android.os.BinderProxy@224b3476 time:83894153

在这篇文章的最后,我又尝试了一次,但现在,使用 HttpClientErrorException...坏消息。

【问题讨论】:

  • 看起来您遇到了 404 not found 错误

标签: java android exception-handling


【解决方案1】:

首先,请不要将您正在使用的变量的名称大写:DAOPostmon 是类的名称,请使用 dAOPostmon 作为您的变量。

您似乎有几个问题,您在 catch 方法中返回了错误的类型。换个方式

return e.printStackTrace();

e.printStackTrace();
return null;

在你的 onPostExecute 中创建你的 if 语句

if(DAOPostmon == null || DAOPostmon.getLogradouro() == null)

【讨论】:

  • 谢谢你,侯赛因。进行更改后,您可以看到失败。但是不仅这个catch就足够了,错误不会导致应用程序关闭?
  • 现在,错误是 java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.clubee.doggywalker.DAOPostmon.getEndereco()' on an null object reference
  • 错误在哪一行?我没有看到您调用 DAOPostmon.getEndereco(),因此它可能位于您的帖子中未包含的代码中的某个位置。