4

我收到此错误:

java.net.SocketTimeoutException: Read timed out
http://api.trove.nla.gov.au/result?key=<KEY HERE>&zone=all&reclevel=brief&q=%20am%20only%20yours%20fear&encoding=json
Exception in thread "main" java.lang.NullPointerException   at
trove.connect.TroveService.QueryTrove(TroveService.java:134)    at
datasetconverter.CsvReader2.main(CsvReader2.java:64) Java Result: 1
BUILD SUCCESSFUL (total time: 1 minute 41 seconds)

当我执行我的代码时:

   public String getJSON(String url, int timeout) throws IOException, Exception {
    try {
        URL u = new URL(url);
        HttpURLConnection c = (HttpURLConnection) u.openConnection();
        c.setRequestMethod("GET");
        c.setRequestProperty("Content-length", "0");
        c.setUseCaches(false);
        c.setAllowUserInteraction(false);
        c.setConnectTimeout(timeout);
        c.setReadTimeout(timeout);
        c.connect();
        int status = c.getResponseCode();

        switch (status) {
            case 504:
            case 503:
                Thread.sleep(10000);
                this.QueryTrove(url);
                break;
            case 200:
            case 201:
                BufferedReader br = new BufferedReader(new InputStreamReader(c.getInputStream()));
                StringBuilder sb = new StringBuilder();
                String line;
                while ((line = br.readLine()) != null) {
                    sb.append(line+"\n");
                }
                br.close();
                return sb.toString();
        }

    } catch (MalformedURLException ex) {
        System.out.println(ex);
        System.out.println(url);
    } catch (IOException ex) {
        System.out.println(ex);
        System.out.println(url);
    }
    return null;
}


    public int QueryTrove(String query) throws Exception{
        int sum =0;
        String json = getJSON("http://api.trove.nla.gov.au/result?key=<KEY HERE>&zone=all&reclevel=brief&q="+query+"&encoding=json",10000);

        Gson gson = new Gson();

        JsonResponse r = gson.fromJson(json, JsonResponse.class);
        for (Zone zone : r.getResponse().getZones()) {
            sum = sum + Integer.parseInt(zone.records.getTotal());
        }

        return sum;
    }

这是因为,setConnectionTimeout如何解决?

4

1 回答 1

5

发生读取超时是因为服务器花费了比“读取超时”参数更长的时间来响应。但是假设您有一个合理的读取超时值(比如说 30 秒),这并不一定意味着问题在于您的读取超时太短,可能是服务器被卡住并且永远不会返回回答。

要诊断,您可以做几件事:

  • 首先尝试查看当您尝试通过浏览器访问时获得完整响应需要多长时间。
  • 尝试摆脱超时(默认为无超时),看看您是否得到响应。

如果服务器响应您的浏览器而不是您的 Java 应用程序,则首先确保您调用的是完全相同的 URL。除此之外,服务器可能由于您的 USER-AGENT 而忽略了您,请尝试模拟真实的浏览器。

也只是一个友好的建议,我会将超时作为参数传递,只需定义一个合理的超时并直接使用它,除非它是一个非常不寻常的用例,否则在使用这种抽象时没有人愿意传递超时。

于 2012-12-04T08:09:57.743 回答