Java 解析时发生读取超时错误

Java 解析时发生读取超时错误,java,Java,使用ScrapingUtils,我正在解析一些URL。为此,我使用以下代码: String link = "Here the link"; Document doc = ScrapingUtils.visit(link, false); if (doc != null) { //code } else { //code } 问题是,有时它无法从客户端接收HTML,并且无法获取数据。我已经尝试了t

使用
ScrapingUtils
,我正在解析一些URL。为此,我使用以下代码:

String link = "Here the link";                                           
Document doc = ScrapingUtils.visit(link, false);

if (doc != null) {
   //code
} else {
   //code
}
问题是,有时它无法从客户端接收HTML,并且无法获取数据。我已经尝试了
try..catch
,这样,如果出现读取超时错误,我可以给变量指定特定值,以了解是否存在错误

我试过这样做:

String link = "Here the link";                                           
Document doc = ScrapingUtils.visit(link, false);

try {
    if (doc != null) {
       //code
    } else {
       //code
    }
catch (TimeoutException exception) {
    throw new TimeoutException("Timeout exceeded: " + timeout + unit);
}
但我在使用
TimeoutException
exception语句时收到一个错误:

TimeoutException异常从不在相应的try语句体中引发

我知道java知道这个异常是毫无意义的,因为它永远不会发生

ScrapingUtils类:

public class ScrapingUtils {
    private static final Logger logger = LoggerFactory.getLogger(ScrapingUtils.class);

    public static Document visit(String urlStr, boolean useProxy) {
        Document doc = null;
        try {
            if (!useProxy) {
                logger.info("Downloading " + urlStr);
                doc = Jsoup.connect(urlStr).userAgent("Mozilla/5.0").maxBodySize(0).timeout(Config.CONNECTION_TIMEOUT).get();
            } else {
                logger.info("downloading " + urlStr);
                URL url = new URL(urlStr);

                String[] proxyStr = NetUtils.getProxy().split(":");
                Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyStr[0], Integer.parseInt(proxyStr[1])));
                HttpURLConnection conn = (HttpURLConnection) url.openConnection(proxy);
                conn.setConnectTimeout(Config.CONNECTION_TIMEOUT);
                conn.connect();

                BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                StringBuilder buffer = new StringBuilder();
                String str;

                while((str = br.readLine()) != null) {
                    buffer.append(str);
                }

                doc = Jsoup.parse(buffer.toString());
            }   
        } catch (IOException ex) {
            logger.error("Error downloading website " + urlStr + "\n" + ex.getMessage());
        }
        return doc;
    }

    public static Document visit(String urlStr) {
        return visit(urlStr, false);
    }
}

嗯。到目前为止,您的代码中永远不会出现
TimeOutException
。但是在这一行中您将得到一个
SocketTimeoutException

doc = Jsoup.connect(urlStr).userAgent("Mozilla/5.0").maxBodySize(0).timeout(Config.CONNECTION_TIMEOUT).get();

到目前为止,您可以像这样在这里处理异常

try {
            if (!useProxy) {
                Jsoup.connect("https://docs.oracle.com").userAgent("Mozilla/5.0").maxBodySize(0).timeout(1000).get();
            } else {
                URL url = new URL("https://docs.oracle.com");
                Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("", 11));
                HttpURLConnection conn = (HttpURLConnection) url.openConnection(proxy);
                conn.setConnectTimeout(1000);
                conn.connect();

                BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                StringBuilder buffer = new StringBuilder();
                String str;

                while ((str = br.readLine()) != null) {
                    buffer.append(str);
                }
            }
        } catch (SocketTimeoutException a) {
            System.out.println("log");
        } catch (IOException ex) {
        }
我修改了代码,以便在我这边工作,并将SocketTimeOut取出。如果您希望始终捕获ScoketTimeOutException,请仅插入:

catch (SocketTimeoutException a) {
            System.out.println("log");
            throw  new SocketTimeoutException();
}
这样,您将强制方法位于方法签名的try/catch或and异常中

try {
            visit("test", true);
        } catch (SocketTimeoutException e) {
            e.printStackTrace();
        }

您必须添加
ScrapingUtils.visit(链接,false)语句。@MạnhQuyế特恩盖伊ễn谢谢,我已经尝试在try语句体中包含该语句,但它一直抛出相同的错误:TimeoutException异常永远不会在相应try语句体中抛出那么您的方法永远不会抛出该错误。您可以尝试另一个例外。你也应该在这里张贴你正在使用的库可能是Ok的副本你从哪里得到的ScrapingUtils?我在任何地方都找不到这方面的文件。
try {
            visit("test", true);
        } catch (SocketTimeoutException e) {
            e.printStackTrace();
        }