java.lang.ExceptionInInitializerError与java.lang.NoClassDefFoundError解决方式

java.lang.ExceptionInInitializerError与java.lang.NoClassDefFoundError解决方式

解决方法

当在静态初始化块中出现了异常的时候,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中语句后继续报错
java.lang.ExceptionInInitializerError与java.lang.NoClassDefFoundError解决方式_第1张图片
原因其实是静态变量初始化失败导致
问题出处

        ResourceBundle rb = ResourceBundle.getBundle("dbinfo");

将配置文件dbinfo.properties放在src文件下解决了所有报错。

你可能感兴趣的:(JavaErrorSolve)