当使用ClassLoader.getSystemClassLoader().getResourceAsStream(“jdbc.properties“);时报空指针异常

首先是自定义的JdbcUtils的一些方法,代码如下

package com.atguigu.utils;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

/**
 * @author zhanglei
 * @date 2020/7/30 - 15:05
 */
public class JdbcUtils {

    private static DataSource dataSource = null;

    static{
        try {
            Properties properties = new Properties();
            InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");
            properties.load(is);
            dataSource = DruidDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 从连接池中返回一个连接。
     * @return 如果返回 null,说明创建连接失败
     */
    public static Connection getConnection(){
        try {
            return dataSource.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

    public static void main(String[] args) {

    }

    public static void close(Connection conn){
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

其中关于静待变量和静态初始化代码块单拿出来说

    private static DataSource dataSource = null;

    static{
        try {
            Properties properties = new Properties();
            System.out.println(properties);
            InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");
            properties.load(is);
            dataSource = DruidDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

这个方法在不涉及 Tomcat 服务器时,在本地测试都没有问题

但是一涉及到 Tomcat 服务器时,具体操作描述为:
在一个注册页面,点击表单提交按钮时,由于要往数据库写入数据,所以在经过 web->service->dao->数据库的【dao->数据库】阶段时,肯定就会利用数据库连接池里的连接进行数据库操作。
那么肯定就会加载上述代码的代码块。

然后报错。首先是页面报错,响应代码500
在这里插入图片描述然后是 Tomcat 服务器端报错信息

java.lang.NullPointerException
	at java.util.Properties$LineReader.readLine(Properties.java:434)
	at java.util.Properties.load0(Properties.java:353)
	at java.util.Properties.load(Properties.java:341)
	at com.atguigu.utils.JdbcUtils.<clinit>(JdbcUtils.java:24)

发现在第24行处也就是下方代码处出现空指针异常

InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");

神奇的是,有两种修改方法:
第一种方法:使用自定义类的加载器替换系统类加载器,即把上方代码替换成

InputStream is = 
	JdbcUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");

第二种方法:更改掉加载配置文件的方式
将此处的 jdbc.properties 文件放置在 idea 的 module 一级目录下,然后在上述代码处使用如下代码代替:

FileInputStream is = 
	new FileInputStream(new File("jdbc.properties"));

即可

但我只知道如何规避这个错误的出现,却不知道这个错误出现的原因
我个人猜测是使用系统加载器的时候,某些权限不够,导致系统加载器无法加载识别配置文件导致的。
欢迎大家指出错误原因,感谢

  • 20
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 22
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值