首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Java中初始化最终变量时出现的问题

在Java中初始化最终变量时出现的问题
EN

Stack Overflow用户
提问于 2010-05-05 21:51:20
回答 5查看 14.7K关注 0票数 21

我在Java中不断遇到一个问题的细微变化,它开始困扰着我,我真的想不出一个合适的方法来绕过它。

我有一个对象属性,它是最终的,但是是动态的。也就是说,一旦赋值,我希望该值是常量,但每次运行时该值都可以不同。因此,我在类的开头声明了类级别变量--比如private final FILE_NAME;。然后,在构造函数中,我给它赋值--比如FILE_NAME = buildFileName();

当我在buildFileName()方法中有抛出异常的代码时,问题就开始了。因此,我在构造函数中尝试了如下内容:

代码语言:javascript
复制
try{
   FILE_NAME = buildFileName();
}
catch(Exception e){
   ...
   System.exit(1);
}

现在我有一个错误--“空白的最终字段FILE_NAME可能还没有初始化。”这就是我开始对Java严格的编译器感到有点恼火的地方。我知道这不是问题,因为如果它到达catch,程序就会退出……但是编译器不知道这一点,所以不允许这样的代码。如果我尝试向catch添加一个虚拟赋值,我会得到-“最后一个字段FILE_NAME可能已经被赋值了。”我显然不能在try-catch之前赋值为默认值,因为我只能赋值一次。

有什么想法...?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-05-05 21:55:16

转念一想,我想我想出了一个解决方案!-使用一个中间变量。

代码语言:javascript
复制
String fileName = null;
try{
   fileName = buildFileName();
}
catch(Exception e){
   ...
   System.exit(1);
}
FILE_NAME = fileName;

不知道为什么我花了这么长时间才想到这个..。

票数 4
EN

Stack Overflow用户

发布于 2010-05-05 21:55:38

怎么样

代码语言:javascript
复制
String tempName = null;
try{
   tempName = buildFileName();
}
catch(Exception e){
   ...
   System.exit(1);
}
FILE_NAME = tempName;
票数 20
EN

Stack Overflow用户

发布于 2010-05-05 22:07:19

任一

代码语言:javascript
复制
try {
   FILE_NAME = buildFileName();
} catch (Exception e){
   ...
   System.exit(1);
   throw new Error();
}

或者有些人更喜欢:

代码语言:javascript
复制
private static final String FILE_NAME = fileName();

private static String fileName() {
    try {
        return buildFileName();
    } catch (Exception e){
        ...
        System.exit(1);
        throw new Error();
    }
}

但是在静态初始化器中调用System.exit可能不是一个好主意。这会把你的单元测试搞乱的。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2773779

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档