URL构造器弃用后改用URI.toURL()出现类型转换异常求解
问题:URL构造器弃用后的ClassCastException解决方法
原代码
原本运行正常的代码:
URL url = new URL(urlStr); HttpsURLConnection con = (HttpsURLConnection) url.openConnection();
问题背景
升级至最新Spring/库版本后,new URL(String url)构造器被标记为弃用,官方建议使用URI.toURL()构建URL实例。
错误改写与异常
尝试用Path转URI的方式改写代码:
Path path = Paths.get(urlStr); URI uri = path.toUri(); HttpsURLConnection con = (HttpsURLConnection) uri.toURL().openConnection();
运行时抛出类型转换异常:
java.lang.ClassCastException: class sun.net.www.protocol.file.fileurlconnection cannot be cast to class javax.net.ssl.HttpsURLConnection (sun.net.www.protocol.file.fileurlconnection and javax.net.ssl.HttpsURLConnection are in module java.base of loader 'bootstrap')
原因分析
Paths.get(urlStr)是本地文件系统路径的处理API,它会把传入的URL字符串当作本地文件路径解析,生成的URI是file:协议类型。此时调用openConnection()返回的是本地文件连接,而非HTTPS连接,因此无法强转成HttpsURLConnection。
正确改写方案
直接使用URI类的构造器解析网络URL,再转换为URL:
try { URI uri = new URI(urlStr); URL url = uri.toURL(); HttpsURLConnection con = (HttpsURLConnection) url.openConnection(); // 后续操作... } catch (URISyntaxException | MalformedURLException e) { // 处理URL/URI格式异常 e.printStackTrace(); }
说明
new URI(urlStr)直接解析网络URL字符串,保留原有的http/https协议类型,不会被当作本地文件路径处理。- 需要处理
URISyntaxException(URI构造时的格式异常)和MalformedURLException(URL转换时的格式异常),这两个都是受检异常。 - 当
urlStr是HTTPS协议时,openConnection()返回的实例可以安全强转为HttpsURLConnection。
内容的提问来源于stack exchange,提问作者Владимир Гичев
相关产品推荐
相关产品推荐

