fan儿 2020-03-22 19:15 采纳率: 0%
浏览 4757

求问如何解决 Could not initialize class JDBC.JDBCUtil?

最近在学JDBC的类的抽取,碰上这个问题了,全程跟着视频写的代码,但是运行不出来,出现这个Could not initialize class错误,搜了一下午还是没头绪,请问各位大佬有类似经历吗,请问是怎么样解决的呢?

这个是JDBC抽取类的代码

package JDBC;

import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
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 JDBCUtil {
    private static String url;
    private static String user;
    private static String password;
    private static String driver;

    // 资源文件读取. 因为只想加载一次,所以写在静态代码块中, 随类的加载而加载到内存(只加载一次)
    static {
        // 读取资源文件, 获取值
        try {
            //1. 创建properties集合类
            Properties pro = new Properties();

            // 获取src路径下的文件方式 --> ClassLoader 类加载器
            ClassLoader classLoader = JDBCUtil.class.getClassLoader();
            URL resource = classLoader.getResource("src/jdbc.properties");
            String path = resource.getPath();
            // System.out.println(path);

            //2. 加载文件
            // pro.load(new FileReader("F:\\JavaEE\\code\\idea_code\\coderZYGui\\day04_jdbc\\src\\jdbc.properties"));
            pro.load(new FileReader(path));

            //3. 获取数据, 赋值
            url = pro.getProperty("url");
            user = pro.getProperty("user");
            password = pro.getProperty("password");
            driver = pro.getProperty("Driver");

            //4. 注册驱动
            Class.forName(driver);

        } catch (IOException e) {
            e.printStackTrace();

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    public static Connection getConnection() throws SQLException {

        // 写死,不好
        // return DriverManager.getConnection("jdbc:mysql://localhost:3306/zy", "root", "1111");
        return DriverManager.getConnection(url, user, password);
    }

    /**
     * 释放资源
     *
     * @param stmt 释放执行sql语句对象
     * @param conn 释放数据库连接对象
     */
    public static void close(Statement stmt, Connection conn) {
        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 释放资源
     *
     * @param rs   释放结果集对象
     * @param stmt
     * @param conn
     */
    public static void close(ResultSet rs, Statement stmt, Connection conn) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

这个是JDBC.properties的代码

url=jdbc:mysql:///db1
user=root
password=ftcftc321
Driver=com.mysql.jdbc.Driver

这个是对JDBCUtil抽取类的使用的代码

package JDBC;


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;



/**
 * @author xf
 *定义一个方法,查询emp表的数据将其封装为对象,然后装载集合,返回。
 */
public class Search {

    public static void main(String[] args) {
        List<Emp> list=new Search().findAll();  
        System.out.print(list);
    }

    public static List<Emp> findAll() {
        // TODO 自动生成的方法存根

         Connection conn=null;
         Statement sttm=null;
         ResultSet rs=null;


        List<Emp> list=new ArrayList<>();
        //1、注册驱动
        try {
            conn=JDBCUtil.getConnection();
            //3、定义SQL语句
            String sql="select *from emp";
            //4、执行SQL对象
            sttm=conn.createStatement();
            //5、执行SQL
            rs=sttm.executeQuery(sql);
            //6、遍历结果集
            Emp emp=null;
            while(rs.next()) {
                int ID=rs.getInt("id");
                String name=rs.getString("ename");
                int job_ID=rs.getInt("job_id");
                int mjr=rs.getInt("mjr");
                Date datetime=rs.getDate("joindate");
                double salary=rs.getDouble("salary");
                double bonus=rs.getDouble("bonus");
                int dep_ID=rs.getInt("dept_id");

                emp=new Emp();
                emp.setID(ID);
                emp.setName(name);
                emp.setJob_ID(job_ID);
                emp.setMjr(mjr);
                emp.setDatetime(datetime);
                emp.setSalary(salary);
                emp.setBonus(bonus);
                emp.setDep_ID(dep_ID);

                list.add(emp);

            }
        } catch (SQLException e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        }finally {
            JDBCUtil.close(rs, sttm, conn);
        }
        return list;
    }

}
  • 写回答

4条回答 默认 最新

  • 陈zzyy 2020-09-06 16:58
    关注

    把jdbc.properties放到src下。 然后:classLoader.getResource("jdbc.properties"); 试一下看看行不行。

    评论

报告相同问题?

悬赏问题

  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料