gpt4 book ai didi

java - 动态加载可能有异常的对象可以声明为final吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:51:53 25 4
gpt4 key购买 nike

起初我打算只针对 Image 类提出问题,但我想让它尽可能广泛地适用。

基本上,这是场景。我正在为 GUI 常量创建一个文件,在这个文件中,我想为我正在使用的每个 Image 设置最终变量。所以我的字段声明如下 UP_ARROW 是:

public static final Image UP_ARROW;

然后我尝试在 ImageIO API 时加载它们,如下所示:

static {
UP_ARROW = ImageIO.read(new File("img/upArrow.png"));
}

不幸的是,这不是有效的、可编译的代码,因为它显式地抛出 IOException,这是我必须处理的。所以我修改它并用 try/catch 包围它:

static {
try {
UP_ARROW = ImageIO.read(new File("img/upArrow.png"));
}
catch(IOException ioe) {
//TODO
}
}

现在我得到一个不同的编译器错误。这次它说有可能该字段可能尚未初始化。好的,这是有道理的。感谢您向我指出这一点,编译器。这似乎是一个简单的修复:

static {
try {
UP_ARROW = ImageIO.read(new File("img/upArrow.png"));
}
catch(IOException ioe) {
UP_ARROW = null;
}
}

现在,无论如何,UP_ARROW 必须填充我的图像或 null。我准备宣布胜利并继续前进。但现在我得到了另一个,意外的编译器错误:

The final field UP_ARROW may already have been assigned

...再次挫败,编译器!

因此问题来了:有没有办法解决这个问题,这样我就可以在运行时动态加载最终字段?还是我宣告失败并简单地使 Image 成为非最终图像?

此外,解释为什么编译器不允许这样做也会有帮助。据我了解,根据上面的代码,UP_ARROW 对象无法在到达 catch{} block 之前分配,因为那一定是抛出异常的原因。因此,如果 try{} 成功执行,则只会发生一次赋值。如果它没有成功执行,仍然只有一个分配发生。怎么会无效呢?

最佳答案

应该做到以下几点:

static {
Image up_arrow = null;
try {
up_arrow = ImageIO.read(new File("img/upArrow.png"));
}
catch(IOException ioe) {
// log the error?
}
UP_ARROW = up_arrow;
}

将最终赋值包含在 finally block 中可能是有意义的。

关于java - 动态加载可能有异常的对象可以声明为final吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13594242/

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