【问题标题】:How to prevent Jsoup from throwing exception on http error?如何防止Jsoup对http错误抛出异常?
【发布时间】:2017-07-29 02:15:25
【问题描述】:

我正在使用 Jsoup 制作应用程序,该应用程序将获取有关公共交通卡现金余额的信息。但是如果用户输入了错误的卡 ID 并且我的应用程序将其发送到网站,服务器将发送 http 错误 409 并输出该 ID 的卡不存在。我设法编写了这个简单的代码:

if (res1.statusCode() == 200) {
   doc1 = res1.parse();
   answer = doc1.body();
   title = answer.text();
} else if (res1.statusCode() == 409) {
  title = "Neteisingas kortelės numeris arba nepavyko patikrinti";
}

它会向String title 写入一些内容,因为如果没有这个解决方案,它会将title 留空,这会导致代码的其他部分出现字符串标记器异常。 毕竟,我提出了一个问题如何防止 Jsoup 抛出异常?

我的例外:

07-27 23:30:12.831 22409-22427/com.bjobs.vvtcards W/System.err: org.jsoup.HttpStatusException: HTTP error fetching URL. Status=409, URL=https://mano.vilniustransport.lt/card/card-check?number=1231234566&_csrf_token=ke_q5dOIIzHCIB5OsuS-N6MlSLXh-im78brCfYn631c
07-27 23:30:12.831 22409-22427/com.bjobs.vvtcards W/System.err:     at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:682)
07-27 23:30:12.831 22409-22427/com.bjobs.vvtcards W/System.err:     at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:629)
07-27 23:30:12.831 22409-22427/com.bjobs.vvtcards W/System.err:     at org.jsoup.helper.HttpConnection.execute(HttpConnection.java:261)
07-27 23:30:12.832 22409-22427/com.bjobs.vvtcards W/System.err:     at com.bjobs.vvtcards.MainActivity$2.run(MainActivity.java:183)
07-27 23:30:12.832 22409-22427/com.bjobs.vvtcards W/System.err:     at java.lang.Thread.run(Thread.java:761)

还有完整的 Jsoup 代码,如果你需要的话:

 try {
                res = Jsoup.connect("https://mano.vilniustransport.lt/login")
                        .userAgent("Mozilla/5.0 (Linux; Android 7.1.1; LG-D855 Build/NOF26W) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.83 Mobile Safari/537.36")
                        .ignoreHttpErrors(true)
                        .method(Connection.Method.GET)
                        .execute();
                doc = res.parse();
                Map welcomeCookies = res.cookies();
                Element inputHidden = doc.select("input").last();
                //String securityTokenKey = inputHidden.attr("name");
                String securityTokenValue = inputHidden.attr("value");
                for (int i = 0; i < cycleCounter; i++) {
                    String fullData = cardsNids.get(i);
                    String[] split = fullData.split("\n");
                    String cardNu = split[1];
                    Connection.Response res1 = Jsoup.connect("https://mano.vilniustransport.lt/card/card-check?number=" + cardNu + "&_csrf_token=" + securityTokenValue)
                            .header("Content-Type", "text/html; charset=UTF-8")
                            .userAgent("Mozilla/5.0 (Linux; Android 7.1.1; LG-D855 Build/NOF26W) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.83 Mobile Safari/537.36")
                            .cookies(welcomeCookies)
                            .execute();
                    if (res1.statusCode() == 200) {
                        doc1 = res1.parse();
                        answer = doc1.body();
                        title = answer.text();
                    } else if (res1.statusCode() == 409) {
                        title = "Neteisingas kortelės numeris arba nepavyko patikrinti";
                    }
                    String presentData = cardsNids.get(i);
                    cardsNids.set(i, presentData + "\n" + title);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

更新代码:

private void checkBalance() {
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                res = Jsoup.connect("https://mano.vilniustransport.lt/login")
                        .userAgent("Mozilla/5.0 (Linux; Android 7.1.1; LG-D855 Build/NOF26W) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.83 Mobile Safari/537.36")
                        .ignoreHttpErrors(true)
                        .method(Connection.Method.GET)
                        .execute();
                doc = res.parse();
                Map welcomeCookies = res.cookies();
                Element inputHidden = doc.select("input").last();
                //String securityTokenKey = inputHidden.attr("name");
                String securityTokenValue = inputHidden.attr("value");
                for (int i = 0; i < cycleCounter; i++) {
                    String fullData = cardsNids.get(i);
                    String[] split = fullData.split("\n");
                    String cardNu = split[1];
                    res1 = Jsoup.connect("https://mano.vilniustransport.lt/card/card-check?number=" + cardNu + "&_csrf_token=" + securityTokenValue)
                            .header("Content-Type", "text/html; charset=UTF-8")
                            .userAgent("Mozilla/5.0 (Linux; Android 7.1.1; LG-D855 Build/NOF26W) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.83 Mobile Safari/537.36")
                            .cookies(welcomeCookies)
                            .execute();

                        doc1 = res1.parse();
                        answer = doc1.body();
                        title = answer.text();
                    String presentData = cardsNids.get(i);
                    cardsNids.set(i, presentData + "\n" + title);
                }
            } catch (HttpStatusException e) {
                if (res1.statusCode() == 409) {
                    title = "Neteisingas kortelės numeris arba nepavyko patikrinti";
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

            // Update the progress bar
            mHandler.post(new Runnable() {
                public void run() {
                    adapter = new RecyclerAdapter(createList(cardsNids.size()));
                    recyclerView.setAdapter(adapter);
                }
            });
        }
    }).start();
}

现在我又遇到了一个错误:

07-28 20:56:51.328 21205-21242/com.bjobs.vvtcards E/AndroidRuntime: FATAL EXCEPTION: Thread-4
                                                                    Process: com.bjobs.vvtcards, PID: 21205
                                                                    java.lang.NullPointerException: Attempt to invoke interface method 'int org.jsoup.Connection$Response.statusCode()' on a null object reference
                                                                        at com.bjobs.vvtcards.MainActivity$2.run(MainActivity.java:194)
                                                                        at java.lang.Thread.run(Thread.java:761)

【问题讨论】:

    标签: java android jsoup


    【解决方案1】:

    试试这个:

    catch (HttpStatusException e) {
        if (res1 != null && res1.statusCode == 409) {
            //handle the exception
        }
    }
    

    【讨论】:

      【解决方案2】:

      当 Jsoup 失败时,它会抛出一个你没有捕捉到的异常——你的代码只捕捉到一个 IOException,但在你的堆栈跟踪中你有一个 HttpStatusException。在第一个 catch 之后添加第二个 catch 子句:

      catch (HttpStatusException e) {
          if (res1.statusCode == 409) {
              //handle the exception
          }
      }
      

      【讨论】:

      • 仍然无法运行我的代码,我在我的问题中发布了我的更新代码和新错误。你的解决方案没有解决我的问题。即使发生 http 错误,我也需要在 try 内循环以继续运行
      猜你喜欢
      • 2018-12-23
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      • 2022-01-01
      • 2017-12-04
      • 2017-09-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多