显然抛出异常但没有被抓住

时间:2018-03-16 13:35:42

标签: android exception networking android-asynctask

正如标题所说,我在AsyncTask中的“doInBackground”中有代码。 代码从Internet读取文本;但是,如果出现问题(例如,连接不可用),它应该表明这种情况。使用易失性变量(并且正在工作)将状态标记到另一个线程,运行Timer。

现在,问题:在调用“urlConnection.connect()”时,函数结束(在调试器中看到)。应用程序报告字符串“Fase 3”,但变量为“lendoInternet”或“contador”(易失性的)保持不变 - 没有异常捕获(!)。另一方面,如果我使用字符串“abracadabra”作为(坏的)URL,则抛出异常。

我的理论:调用“urlConnection.connect();”将AsyncTask发送给Jupiter;我的意思是,它崩溃得如此之难以至于即使异常处理也没有得到尊重(但是:Timer线程继续更新UI)。是的,愚蠢的理论,但我在这里需要一些亮点。

这个东西在Android Studio中启动的模拟器中运行。顺便说一句,在最后一个街区,葡萄牙语中的字符串意思是“嘿,Java,你的母亲做得好吗?”,表明我对这种可爱的编程语言的温柔(用你喜欢的德语诅咒取而代之)。

谢谢你们。

        lendoInternet = true;
        erroInternet  = false;

        try {
            URL url = new URL("https://www-eng-x.llnl.gov/documents/a_document.txt");   result = "-Fase-2-";
            //URL url = new URL("abracadabra");   result = "-Fase-2-";
            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); result = "-Fase-3-";
            urlConnection.connect();                                                    result = "-Fase-4-";
            InputStream is = new BufferedInputStream(urlConnection.getInputStream());   result = "-Fase-5-";
            BufferedReader r = new BufferedReader(new InputStreamReader(is));           result = "-Fase-6-";

            StringBuilder total = new StringBuilder();
            String line;
            while ((line = r.readLine()) != null) {
                total.append(line).append('\n');
            }
            result = total.toString();
        } catch (IOException t) {
            contador = 1;
            lendoInternet = false;
            erroInternet = true;
        } catch (Throwable t) {
            contador = 1;
            lendoInternet = false;
            erroInternet = true;
        }
        finally {
            result = "Sua maezinha vai bem, Java?";
        }

2 个答案:

答案 0 :(得分:0)

我认为urlConnection.connect()之后的代码可能会被优化,因为您为result块中的变量finally分配了定义的值。

答案 1 :(得分:0)

事实证明,问题在于等待异常。我会解释一下。

代码在尝试连接时被冻结(计算机在代理后面);通过设置短暂超时,例如:

            urlConnection.setConnectTimeout(3000);

并等待它,瞧,代码按预期工作。

现在,什么是默认超时?这里的测试执行了10秒,没有运气;根据{{​​3}},默认超时可能是无限的。

感谢您的评论和想法。