今天在学习JDBC的过程中,运行一个JDBC的Java时报错,错误如下:
Exception in thread "main" java.lang.NoClassDefFoundError: Could not initialize class me.gacl.utils.JdbcUtils
at me.gacl.demo.Test.main(Test.java:30)
查了一下,这个异常是说找不到me.gacl.utils.JdbcUtils这个类,看了一下这个的代码,如下:
package me.gacl.utils;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class JdbcUtils {
private JdbcUtils(){};
private static String driver = null;
private static String url = null;
private static String username = null;
private static String password = null;
static{
try{
//读取db.properties文件中的数据库连接信息
Properties prop = new Properties();
InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties");
prop.load(in);
//获取数据库连接驱动
driver = prop.getProperty("driver");
//获取数据库连接URL地址
url = prop.getProperty("url");
//获取数据库连接用户名
username = prop.getProperty("username");
//获取数据库连接密码
password = prop.getProperty("password");
//加载数据库驱动
Class.forName(driver);
}catch(Exception e){
throw new ExceptionInInitializerError(e);
}
}
public static Connection getConnection()throws SQLException{
return DriverManager.getConnection(url,username,password);
}
public static void release(Connection conn,Statement st,ResultSet rs){
if(rs!=null){
try{
//关闭存储查询结果的ResultSet对象
rs.close();
}catch(Exception e){
e.printStackTrace();
}
rs = null;
}
if(st!=null){
try{
//关闭负责执行SQL命令的Statement对象
st.close();
}catch(Exception e){
e.printStackTrace();
}
}
if(conn!=null){
try{
//关闭Connection数据库连接对象
conn.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
}
发现并没有出现明显的错误,在看错误信息,发现无法实例化这个类,所以是静态代码块的问题,想看具体出现的异常是什么,于是把throw new ExceptionInInitializerError(e);
改为e.printStackTrace();然后出现了具体的异常信息如下:
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 me.gacl.utils.JdbcUtils.<clinit>(JdbcUtils.java:25)
at me.gacl.demo.Test.main(Test.java:17)
java.sql.SQLException: The url cannot be null
at java.sql.DriverManager.getConnection(DriverManager.java:649)
at java.sql.DriverManager.getConnection(DriverManager.java:247)
at me.gacl.utils.JdbcUtils.getConnection(JdbcUtils.java:45)
at me.gacl.demo.Test.main(Test.java:17)
发现出现异常的原因是这个类url为空,说明InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties");中的db.properties无法得到,然后再去看class.getClassLoader().getResourceAsStream的方法,显示这个方法会从classpath下去获取文件,所以一般把配置文件放在工程的WEB-INFclasses文件夹下,然后发现db.properties不在classes文件下下,至此异常解决。
将配置文件放在classes目录下就可以解决问题。