Java 类静态初始化块中的类用法

Java 类静态初始化块中的类用法,java,class,static,Java,Class,Static,可能在什么地方讨论过,但我没找到 我需要在类静态初始化块中加载类属性(java.util.properties)。这样,即使不创建对象,也可以访问某些类常规选项。为此,我需要适当的类对象。当然,在null对象上访问此类类对象失败。像这样的 Class Name { private static Properties properties; static { Name.properties = new Properties(); Name.pro

可能在什么地方讨论过,但我没找到

我需要在类静态初始化块中加载类属性(
java.util.properties
)。这样,即使不创建对象,也可以访问某些类常规选项。为此,我需要适当的
对象。当然,在
null
对象上访问此类类对象失败。像这样的

Class Name {

    private static Properties properties;

    static {
        Name.properties = new Properties();
        Name.properties.load(Name.class.getResourceAsStream("Name.properties"));
    }

}
你知道怎么处理这种情况吗

更新:
这是资源名称(对于我的案例,应该是“/name.properties”)。其他一切都很好。
+1感谢我和。。。不要忘记逐个检查操作:-)。

属性
字段必须是
静态
。在
load
之前,您需要使用
proeprities=new Properties()
初始化静态变量,然后您可以调用
load

属性
字段必须是
静态
。在
load
之前,您需要使用
proeprities=newproperties()
初始化静态变量,然后可以调用
load

将属性声明为静态并初始化

static Properties properties;

并且静态块应该是

static {
    try {
        properties = new Properties(); //if you have not initialize it already
        Name.properties.load(Name.class.getResourceAsStream("Name.properties"));
    } catch (IOException e) {
        throw new ExceptionInInitializerError(e); //or some message in constructor
    }
}

您需要在加载属性文件时捕获IOException

将属性声明为静态并初始化

static Properties properties;

并且静态块应该是

static {
    try {
        properties = new Properties(); //if you have not initialize it already
        Name.properties.load(Name.class.getResourceAsStream("Name.properties"));
    } catch (IOException e) {
        throw new ExceptionInInitializerError(e); //or some message in constructor
    }
}

您需要在加载属性文件时捕获IOException,基于所有建议的最终代码如下所示:

Class Name {

    private static final Properties properties = new Properties();

    static {
        try {
            InputStream stream = Name.class.getResourceAsStream("/Name.properties");
            if (stream == null) {
                throw new ExceptionInInitializerError("Failed to open properties stream.");
            }
            Name.properties.load(stream);
        } catch (IOException e) {
            throw new ExceptionInInitializerError("Failed to load properties.");
        }
    }
}

基于所有建议的最终代码如下所示:

Class Name {

    private static final Properties properties = new Properties();

    static {
        try {
            InputStream stream = Name.class.getResourceAsStream("/Name.properties");
            if (stream == null) {
                throw new ExceptionInInitializerError("Failed to open properties stream.");
            }
            Name.properties.load(stream);
        } catch (IOException e) {
            throw new ExceptionInInitializerError("Failed to load properties.");
        }
    }
}


声明
properties
也是静态的。谢谢,它实际上是用原始代码完成的,输入错误。更正。我希望以下内容能对您有所帮助:如果您要将Name.properties设置为新的属性对象,则唯一可以为null的是
getResourceAsStream
返回的值。确保Name.properties与.jar文件中的Name.class位于同一目录中。刚刚找到了相同的内容。也声明
properties
static。谢谢,这实际上是在原始代码中完成的,输入错误。更正。我希望以下内容能对您有所帮助:如果您要将Name.properties设置为新的属性对象,则唯一可以为null的是
getResourceAsStream
返回的值。确保Name.properties与.jar文件中的Name.class位于同一目录中。只需找到相同的内容。
printStackTrace
是处理异常最糟糕的方法之一,除非Roman实际上不关心是否加载了属性文件。正确的操作过程是
抛出新的运行时异常(e)。我知道我只是想针对这个问题,OP需要正确处理异常。我不会为他写完整的代码:)一个
例外的初始化错误
会更好:“表示静态初始值设定项中发生意外异常。抛出ExceptionInInitializerError以指示在计算静态初始值设定项或静态变量初始值设定项期间发生异常。“@GyroGearless yes exceptionininitializerror更合适
printStackTrace
是处理异常最糟糕的方法之一,除非Roman实际上不在乎是否加载了属性文件。正确的操作过程是
抛出新的运行时异常(e)。我知道我只是想针对这个问题,OP需要正确处理异常。我不会为他写完整的代码:)一个
例外的初始化错误
会更好:“表示静态初始值设定项中发生意外异常。抛出ExceptionInInitializeError以指示在对静态初始值设定项或静态变量的初始值设定项求值期间发生异常。“@GyroGearless yes ExceptionInInitializeError更合适