BufferedReader初始化挂起?

时间:2014-12-26 11:25:24

标签: java url tcp wikipedia

我试图从网络上阅读内容(更具体地说是维基百科),并且只要它不存在的维基页面(即http://en.wikipedia.org/wiki/Asdfasdfasdfasdf),我的BufferedReader就会在init上挂起。我把它缩小到init而不是readLine(),我觉得很奇怪。我的代码如下:

URL url = new URL("http://en.wikipedia.org/wiki/" + query.replace(" ", "_"));
URLConnection connection = url.openConnection();
BufferedReader wikiReader = new BufferedReader(new InputStreamReader(connection.getInputStream()));

在wikiReader初始化之后的任何代码都不会执行,但这不存在维基页面的问题......任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:4)

我强烈怀疑它没有悬挂 - 它只是在你没注意到的情况下抛出异常。我希望它能抛出FileNotFoundException,这就是我尝试时发生的事情。

它发生在readLine()之前,因为getInputStream()将发出HTTP请求,而且失败了。它永远不会达到BufferedReader构造函数本身 - 如果您将代码更改为:

,您可以看到这一点
InputStream inputStream = connection.getInputStream();
// You won't get to here whne the page doesn't exist
BufferedReader wikiReader = new BufferedReader(new InputStreamReader(inputStream));

基本上,您需要查看堆栈中捕获异常的位置...并确保它是合适的。首先,您应该确保记录异常,然后计算出您之后要做的事情......这在很大程度上取决于您的应用程序的功能。

答案 1 :(得分:1)

当URL指向不存在的页面时,会发生以下异常:

java.io.FileNotFoundException: http://en.wikipedia.org/wiki/Asdfasdfasdf

因此,您基本上需要使用try / catch来处理异常:

URL url = new URL("http://en.wikipedia.org/wiki/" + query.replace(" ", "_"));
URLConnection connection = url.openConnection();
try (BufferedReader wikiReader = new BufferedReader(new InputStreamReader(connection.getInputStream()))) {
        // Here you can handle the correct stuff
} catch (IOException e) {
    // here you can handle the error stuff
}