使用类加载器关联文件后,加载出现空指针的问题

4 篇文章 0 订阅
3 篇文章 0 订阅

今天使用JDBC连接数据库,在读取文件时出现了空指针异常
代码如下:

public class JDBCUtils {
    public static Connection getConnection() throws Exception {
        // 获得类加载器,将加载器关联文件
        InputStream is = this.class.getResourceAsStream("SQLFile.properties");

        // 加载文件
        Properties pro = new Properties();
        pro.load(is); // 出现空指针

        ....
    }
}

在这里插入图片描述
于是我输出了一下 is 控制台输出为 null,说明没有读取到文件,只能说明一点,没有找到文件

类加载器只能寻找src目录下的资源

  1. 相对路径:相对路径的相对目标是相对于当前类
  2. 绝对路径:起点从src出发
相对路径:

我们先来看一下目录的结构
在这里插入图片描述

public class JDBCUtils {
    public static Connection getConnection() throws Exception {
        // 获得类加载器,将加载器关联文件
        InputStream is = JDBCUtils.class.getResourceAsStream("SQLFile.properties");
//        InputStream is = JDBCUtils.class.getResourceAsStream("./SQLFile.properties");
        ....
    }
}

. / 表示当前目录( . / 在开头可省略)

  • 第二种方式的意思是在utils目录下寻找 SQLFile.properties 文件,显然是找不到的,因为SQLFile.properties在src目录级下,而第一种方式恰好与第二种方式等价,因此找不到
  • 如果要连接数据库,解决方式有两种,将配置文件移动到所需要的类下
    在这里插入图片描述
  • 或者将代码改为
public class JDBCUtils {
    public static Connection getConnection() throws Exception {
        // 获得类加载器,将加载器关联文件
        InputStream is = JDBCUtils.class.getResourceAsStream("./../../SQLFile.properties");
//        InputStream is = JDBCUtils.class.getResourceAsStream("../../SQLFile.properties");
        ....
    }
}

. . / 表示上一级目录( . / 在开头可省略)

绝对路径:

同样的目录结构
在这里插入图片描述

public class JDBCUtils {
    public static Connection getConnection() throws Exception {
        // 获得类加载器,将加载器关联文件
        InputStream is = JDBCUtils.class.getResourceAsStream("/SQLFile.properties");
    }
}

由前面可知,绝对路径从src出发,此时的 / 便代表src目录,意思是在src目录下寻找配置文件,显然存在

注意:

实际上真正的目录结构是编译出来的目录,也就是说需要按照编译出的目录寻找
在这里插入图片描述

对于maven web工程:

resources下的配置文件在编译后在classes目录级下,也就是说,绝对路径的起点是classes目录

在这里插入图片描述

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值