java - Servlet 中的意外异常行为

标签 java exception servlets

我有下面的类,它从属性文件加载数据库详细信息。当文件“dao.properties”丢失时,类应该抛出 DAOConfigurationException 但我得到了

    javax.servlet.ServletException: Servlet execution threw an exception
root cause

java.lang.ExceptionInInitializerError
    com.clone.dao.DAOFactory.getInstance(DAOFactory.java:19)
    com.clone.controller.register.doPost(register.java:35)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
root cause

com.clone.dao.DAOConfigurationException: Properties file dao.properties not found in classpath.
    com.clone.dao.DAOProperties.<clinit>(DAOProperties.java:15)
    com.clone.dao.DAOFactory.getInstance(DAOFactory.java:19)
    com.clone.controller.register.doPost(register.java:35)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

在后续请求中我收到此异常

javax.servlet.ServletException: Servlet execution threw an exception
root cause

java.lang.NoClassDefFoundError: Could not initialize class com.clone.dao.DAOProperties
    com.clone.dao.DAOFactory.getInstance(DAOFactory.java:19)
    com.clone.controller.register.doPost(register.java:35)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

这是我的代码

package com.clone.dao;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class DAOProperties {
    private static final String PROPERTIES_FILE = "dao.properties";
    private static final Properties PROPERTIES = new Properties();
<b> static{
        ClassLoader classloader = Thread.currentThread().getContextClassLoader();
        InputStream propertiesFile = classloader.getResourceAsStream(PROPERTIES_FILE);

        if(propertiesFile==null){
            throw new DAOConfigurationException("Properties file "+PROPERTIES_FILE+" not found in classpath.");
        } 
        try {
            PROPERTIES.load(propertiesFile);
        } catch (IOException e) {
            throw new DAOConfigurationException("Cannot load properties file '"+PROPERTIES_FILE+"'.", e);
        }
    }
</b>
private String specificKey;


    public DAOProperties(String specificKey)
    {
        this.specificKey=specificKey;
    }

    public String getProperty(String key) throws DAOConfigurationException {
        String fullKey = specificKey+"."+key;
        String property = PROPERTIES.getProperty(fullKey);
        if(property==null||property.trim().length()==0){
            throw new DAOConfigurationException("Property '"+fullKey+"' is missing in properties file '"+
                                                        PROPERTIES_FILE+"'.");
        }
        return property;
    }

}

伙计们,请解释一下发生了什么,这很令人困惑

最佳答案

正在抛出DAOConfigurationException:

com.clone.dao.DAOConfigurationException: Properties file dao.properties
     not found in classpath.

但是,它被包含在 java.lang.ExceptionInInitializerError 中,因为您的 DAOFactory 正在尝试使用 DAOProperties。由于静态初始化器失败,DAOProperties 类无法正确初始化,而 ExceptionInInitializerError 正是静态初始化器失败时抛出的异常。

也许您不应该在静态初始化程序中执行此操作?

关于java - Servlet 中的意外异常行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13540200/

相关文章:

java - Swagger codegen to Java Spring 从二进制格式的 OpenAPI 组件生成不正确的文件响应实体

java - Maven 不会下载外部项目所需的依赖项

java - GSON 一个 Java Throwable

java - 为什么 Google Cloud API 会尝试以最终用户身份进行连接?

java - 将数据从 RecyclerView 适配器传递到另一个 Activity

exception - 如果在单独的类中定义了异常子句,则 Camel 异常处理将不起作用

java - 在业务层返回业务验证结果的首选方法是什么

rest - 实例化 servlet 类 org.glassfish.jersey.servlet.ServletContainer 时出错

reactjs - 在 Servlet 环境中部署 React 应用程序

java - 如何使用 ServletContainerInitializer 映射 REST Web 服务?