公司项目中getResource使用不当导致的BUG

本文探讨了一起因使用getResource方法不当导致的跨平台问题,问题出现在Linux和Windows之间。getResource原理涉及类加载器和URL对象,资源通常从war或jar包中读取。解决方案在于理解getResource对路径的处理,特别是'/'前缀的使用。修正代码时,应避免使用File.separator,而使用'/'. 提到在JavaEE项目中,推荐使用Thread.currentThread().getContextClassLoader()动态加载资源,以确保类加载器的可见性和隔离性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题出现

该代码是一个文件下载的功能,代码在linux服务器上能够运行,但是检出到本地(windows)后报错。错误的原因是文件流没有获取到数据源,存在空指针异常。
从上面的分析,大概就能推断,问题的原因出现该代码无法进行跨平台执行。
这里贴两段出现问题的代码,就是简单的路径获取,没有什么业务相关的部分

String xmlPath = (new StringBuilder(128)).append(this.getClass()
                    .getResource("/").getPath()).append("uploadConfig")
                    .append(File.separator).append("upload.xml").toString();//获取xml的路径
            String modelPath = request.getSession().getServletContext().getRealPath(File.separator+"excel"+File.separator+modelName);

上面的逻辑就是获取到xml的路径,然后使用XML解析对象拿到modelName属性,这个属性的值是一个Excel文件的简单名称,然后拿到这个Excel文件的服务器真实路径。

可以看到,上面的代码其实考虑到了跨平台性,因为使用了File.sparator,该常量在unix系统会被识别为/,而在window系统会被识别为\\ 。
上面的问题主要出现在getResource上。

getResource原理

    public java.net.URL getResource(String name) {
   
        name = resolveName(name);
        ClassLoader cl = getClassLoader0();
        if 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值