我试图从网络上阅读内容(更具体地说是维基百科),并且只要它不存在的维基页面(即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初始化之后的任何代码都不会执行,但这不存在维基页面的问题......任何帮助都将不胜感激。
答案 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
}