当在静态初始化块中出现了异常的时候,JVM会抛出java.lang.ExceptionInInitializerError异常。
通常是由于静态变量初始化失败导致。
所以调用该类静态方法时会抛出java.lang.NoClassDefFoundError异常。
通常只要仔细检查静态变量初始化即可解决该问题。
本人在编写相关JDBC代码时出现了该问题。
DB工具类及静态初始化代码
package IntegratedOperation.util;
import java.sql.*;
import java.util.ResourceBundle;
public class DBUtils {
private static String driverClass;
private static String url;
private static String username;
private static String password;
static{
// 此对象用于加载properties配置文件
ResourceBundle rb = ResourceBundle.getBundle("dbinfo");
driverClass = rb.getString("driverClass");
url = rb.getString("url");
username = rb.getString("username");
password = rb.getString("password");
try {
Class.forName(driverClass);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
// 得到连接方法
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url,username,password);
}
// 关闭资源方法
public static void closeAll(ResultSet rs, Statement stmt, Connection conn){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs=null;
}
if(stmt!=null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
stmt=null;
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn=null;
}
}
}
调用
package IntegratedOperation.crud;
import Demo.User;
import IntegratedOperation.util.DBUtils;
import org.junit.Test;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
public class TestCRUD {
@Test
public void testSelect(){
Connection conn=null;
Statement stmt=null;
ResultSet rs=null;
try {
conn = DBUtils.getConnection();
stmt = conn.createStatement();
rs = stmt.executeQuery("select * from users");
List list = new ArrayList<>();
while(rs.next()){
User u = new User();
u.setId(rs.getInt("id"));
u.setName(rs.getString("name"));
u.setPassword(rs.getString("password"));
u.setEmail(rs.getString("email"));
u.setBirthday(rs.getDate("birthday"));
list.add(u);
}
for (User user:list){
System.out.println(user);
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
DBUtils.closeAll(rs, stmt, conn);
}
}
}
运行报错
注释了final中语句后继续报错
原因其实是静态变量初始化失败导致
问题出处
ResourceBundle rb = ResourceBundle.getBundle("dbinfo");
将配置文件dbinfo.properties放在src文件下解决了所有报错。