java.lang.ExceptionInInitializerError/java.lang.NullPointerException(Tomcat浏览器500报错解决方案)

 我利用Durid连接池连接数据库时,无法识别properties路径,原因竟然是因为:ClassLoader.getSystemResourceAsStream()方法!!!

 以下是错误内容:

 最主要的原因就是无法识别properties的路径

当时我是这样写的:

 我使用了Java的ClassLoader来加载位于Classpath中的资源文件"servletDemo.properties",并返回一个InputStream对象。而ClassLoader.getSystemResourceAsStream()方法主要用于加载位于Classpath中的资源文件。

什么是Classpath?

Classpath是Java中用于搜索类和资源的路径。它是由一组目录和JAR文件组成的列表。当Java程序执行时,JVM会在类路径下搜索类和资源文件,并加载它们。

在Java中,资源文件是指应用程序使用的非代码文件,例如配置文件、图像、声音文件等。这些文件通常用于存储应用程序的配置信息或提供其他静态数据。

在Classpath中的资源文件指的是相对于Classpath根目录的路径,即资源文件的相对路径。当你将资源文件放在Classpath中的某个目录或JAR文件中时,它们可以被Java程序通过类加载器来访问。

虽然我不知道它识别不了的具体原因,但是换个方式就能解决问题了

解决方式一:利用FileInputStream("绝对路径")的方式找到properties文件

当然也可以用其他类,properties.load()方法中的参数具有Reader、InputStream两种,FileInputStream 是InputStream的子类,所以能够被load使用

public class DruidUtils {
    static DataSource dataSource = null;
    static {
        
        FileInputStream is = null;
        try {
            is = new FileInputStream("F:\\develop\\servletLoginNew\\src\\servletDemo.properties");
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        }
        
        Properties prop = new Properties();
        try {
            prop.load(is);
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
             dataSource = DruidDataSourceFactory.createDataSource(prop);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public static Connection getConnection(){
        Connection connection = null ;
        try {
            connection= dataSource.getConnection();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }

        return connection;
    }

}

解决方式二:将properties中的内容写死(也就是写进代码中)

我就不信你这样还找不到

public class NewDruidUtils {

    public static Connection getConnection() {
        Connection connection = null;

        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        // 配置数据库连接信息
        dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/servletDemo");
        dataSource.setUsername("root");
        dataSource.setPassword("root");
        try {
            dataSource.init();
            connection = dataSource.getConnection();
            // 使用数据库连接进行操作...

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 关闭数据源
            dataSource.close();
        }
        return connection;
    }
}

 解决方式三:将ClassLoader.getSystemResourceAsStream()替换成下面的方式,也是可以的

 InputStream is = DruidUtils.class.getClassLoader().getResourceAsStream("servletDemo.properties");

 若想知道它们的区别请移步:

类名.class.getClassLoader().getResourceAsStream(“.“);和ClassLoader.getSystemResourceAsStream(“.“)的区别!!!

public class DruidUtils{
    static DataSource dataSource = null;
    static {
      
        InputStream is = DruidUtils.class.getClassLoader().getResourceAsStream("servletDemo.properties");

        Properties prop = new Properties();
        try {
            prop.load(is);
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
             dataSource = DruidDataSourceFactory.createDataSource(prop);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public static Connection getConnection(){
        Connection connection = null ;
        try {
            connection= dataSource.getConnection();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }

        return connection;
    }

}

若遇到java.lang.NoClassDefFoundError: org/apache/commons/dbutils/ResultSetHandler 

可以移步:java.lang.NoClassDefFoundError: org/apache/commons/dbutils/ResultSetHandler(Tomcat浏览器500报错解决方案)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值