gpt4 book ai didi

java - 静态 block java中的常量问题

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:45:25 26 4
gpt4 key购买 nike

我有两个关于静态 block 和常量的问题,代码如下。

  1. 常量(甚至简单的静态变量)不能直接从静态 block 中引用。它给出错误提示“无法在定义前引用字段”。但是通过静态方法访问是可以的。
  2. 如果我如下所述为静态 block 的 catch 中的常量分配一个值,它会给出错误提示“最终字段名称可能已经分配”。但是如果在 catch 中分配它会给出错误消息“空白的最终字段 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";

}

最佳答案

你只能给NAME赋值一次(因为它是final)。将结果分配给一个临时变量,然后分配给 NAME(并且不要默默地吞下 Exception)。类似的东西,

static {
String temp = null;
try {
temp = dummyStringValue();
} catch (Exception e) {
e.printStackTrace();
}
NAME = temp;
}

您不能按照当前方式分配 NAME 的原因是因为编译器执行 static program analysis (特别是 data-flow analysis )并且检测到可能存在未分配 NAME 的代码路径。因为 NAME 是 final,所以这是一个编译错误。

关于java - 静态 block java中的常量问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36600653/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com