如何使我的程序返回MalformedUrlException而不只是通用异常?
我正在做一个简单的函数,该函数读取用户在控制台中输入的URL,并从URL返回内容。我需要它来检查URL是否是有效URL或不是有效URL。
示例网址: http://google.com/not-found.html http:/google.com
我创建了两个catch异常,但似乎总是返回整体异常,而不是MalformedUrlException。
public static String getUrlContents(String theUrl) {
String content = "";
try {
URL url = new URL(theUrl);
//Create a url connection object
URLConnection urlConnection = url.openConnection();
//wrap the url connection a buffered reader
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
String line;
while((line = bufferedReader.readLine()) != null) {
content += line + "\n";
}
bufferedReader.close();
} catch (MalformedURLException e) {
System.out.println("The following url is invalid'" + theUrl + "'");
//logging error should go here
} catch (Exception e) {
System.out.println("Something went wrong, try agian");
}
return content;
}
答案 0 :(得分:0)
首先,“找不到”资源不是java.net.MalformedURLException:
公共类MalformedURLException扩展了IOException
抛出该错误表示URL格式错误。没有合法的 协议可以在规范字符串中找到,或者该字符串可以 无法解析。
我了解到,您想在URL导致找不到返回代码(404)时遇到这种情况。为此,您需要检查HTTP响应代码。
最简单的方法是使用java.net.HttpURLConnection
:
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/net/HttpURLConnection.html
公共抽象类HttpURLConnection扩展了URLConnection
一个支持HTTP特定功能的URLConnection。见规格 有关详细信息。
每个HttpURLConnection实例用于发出单个请求,但是 与HTTP服务器的基础网络连接可能是 由其他实例透明共享。调用close()方法 在HttpURLConnection的InputStream或OutputStream上 请求可能会释放与此实例关联的网络资源,但 对任何共享的持久连接没有影响。呼叫 如果持久化,disconnect()方法可能会关闭基础套接字 否则连接当时是空闲的。
您可以通过调用getResponseCode()
来检查响应代码。如果结果小于400,则表示得到有效的响应,否则出现客户端错误(4xx)或服务器错误(5xx)。
类似这样的东西:
public static String getUrlContents(String theUrl) {
String content = "";
try {
URL url = new URL(theUrl);
//Create a url connection object
URLConnection urlConnection = url.openConnection();
if (urlConnection instanceof HttpURLConnection) {
HttpURLConnection conn = (HttpURLConnection) urlConnection;
if (conn.getResponseCode() < 400) {
// read contents
} else {
System.out.println(conn.getResponseMessage());
// treat the error as you like
}
} else {
// not a HTTP connection, treat as you like
}
} catch (MalformedURLException e) {
System.out.println("The following url is invalid'" + theUrl + "'");
//logging error should go here
} catch (Exception e) {
System.out.println("Something went wrong, try agian");
}
return content;
}
我还没有检查代码,但是我认为您可以了解总体思路。