静态块java中的常量问题

nam*_*olk 3 java static exception-handling

我有两个关于静态块和常量的问题,下面的代码.

  1. 常量(甚至简单的静态变量)不能直接从静态块引用.它给出了"在定义之前无法引用字段"的错误.但是通过静态方法访问时可以.
  2. 如果我为静态块的catch中的常量赋值,如下所述,则会给出错误,说"可能已经分配了最终字段NAME".但是如果在捕获时它会给出错误,说"空白的最终字段NAME可能尚未初始化".

我想知道为什么会这样?

代码:

public class TestStaticblock {

    static{
        try {
//          NAME = dummyStringValue() + NAME_APPENDER; // Cannot reference a field before it is defined
//          NAME = dummyStringValue() + getNameAppender(); // This is OK

            NAME = dummyStringValue();
        } catch (Exception e) {
            NAME = null; // The final field NAME may already have been assigned
        }
    }

    private static String dummyStringValue() throws Exception{
        return "dummy";
    }

    private static String getNameAppender() throws Exception{
        return NAME_APPENDER;
    }

    private static final String NAME; // If I comment Catch it says "The blank final field NAME may not have been initialized"
    private static  String NAME_APPENDER = "appender";

}
Run Code Online (Sandbox Code Playgroud)

Ell*_*sch 5

您只能分配NAME一次(因为它final).将结果分配给临时变量,然后分配给NAME(并且不要以静默方式吞下Exceptions).就像是,

static {
    String temp = null;
    try {
        temp = dummyStringValue();
    } catch (Exception e) {
        e.printStackTrace();
    }
    NAME = temp;
}
Run Code Online (Sandbox Code Playgroud)

您无法分配NAME当前方式的原因是编译器执行静态程序分析(特别是数据流分析)并检测到可能存在未分配NAME的代码路径.因为NAME是final,这是一个编译错误.