在 Java 20 及更高版本中,不推荐直接使用 new URL(String spec)
构造方法。官方建议通过更加安全和明确的方式来创建 URL
。下面示例给出两种常见替代方案:使用 URI
转化为 URL
,或使用多参数构造方法。
原始写法(已弃用)
public class UrlDemo {
public static void main(String[] args) {
try {
// 自 Java 20 起已弃用
URL url = new URL("https://www.example.com");
System.out.println(url.getHost());
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
}
问题说明
new URL(String spec)
在 Java 20 中被标记为 Deprecated,不再建议使用。
方案一:使用 URI
并转化为 URL
这是最推荐的做法,先使用 URI
的构造方法或解析方法,随后通过 uri.toURL()
得到 URL
:
public class UrlDemo {
public static void main(String[] args) {
try {
// 首先创建 URI 对象
URI uri = new URI("https://www.example.com");
// 再通过 toURL() 转换为 URL
URL url = uri.toURL();
System.out.println(url.getHost());
} catch (URISyntaxException | MalformedURLException e) {
e.printStackTrace();
}
}
}
优点
- 语义更清晰:URI 对象更符合通用资源标识符语义,且能够更好地处理相对路径等情况。
- 异常更准确:如果字符串不符合 URI 语法,会抛出
URISyntaxException
;若无法转化为 URL 会抛出MalformedURLException
,分类更明确。
方案二:使用多参数构造方法
可以使用 URL(String protocol, String host, int port, String file)
或者其变体,以显式地为 protocol
、host
、port
、file
赋值。例如:
public class UrlDemo {
public static void main(String[] args) {
try {
// 明确指定协议、主机、端口、路径
URL url = new URL("https", "www.example.com", 443, "/path/to/resource");
System.out.println(url.getHost());
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
}
优点
- 分段指定:将
protocol
、host
、port
、file
分开,避免字符串拼装带来的可读性差或语义不清的问题。 - 异常处理:若传入的组合无效,会抛出
MalformedURLException
。
总结
- 已弃用方法:
new URL(String spec)
自 Java 20 起被标记为弃用,不建议继续使用。 - 替代方法:
- 先创建
URI
对象再使用uri.toURL()
(官方推荐) - 使用
URL
的多参数构造方法,明确指定协议、主机、端口和文件路径
- 先创建
具体选择哪种替代方式,应根据你对字符串解析、异常处理和资源定位的需求来决定。最常见、最安全的做法是 先解析为 URI
,然后再转成 URL
。