首先是自定义的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"));
即可
但我只知道如何规避这个错误的出现,却不知道这个错误出现的原因
我个人猜测是使用系统加载器的时候,某些权限不够,导致系统加载器无法加载识别配置文件导致的。
欢迎大家指出错误原因,感谢