• 使用JDBC出现NoClassDefFoundError异常的解决方法


    今天在学习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目录下就可以解决问题。

  • 相关阅读:
    二项式定理与组合恒等式
    「CEOI2020」象棋世界 题解
    矩阵 题解
    研一总结
    你明白transform中的skew属性是何如变换的吗?
    pip安装包
    Yaml中特殊符号"| > |+ |-"的作用
    使用ROOT用户运行Jenkins
    检查MySQL主从复制运行状态
    powerdesigner 怎么逆向生成 pdm文件
  • 原文地址:https://www.cnblogs.com/cuijiade/p/9261546.html
Copyright © 2020-2023  润新知