Java 动态加载了可能的异常的对象是否可以声明为final?
起初,我只想提出关于Java 动态加载了可能的异常的对象是否可以声明为final?,java,variables,dynamic,exception-handling,final,Java,Variables,Dynamic,Exception Handling,Final,起初,我只想提出关于Image类的问题,但我想让它尽可能广泛地适用 基本上,情况是这样的。我正在为GUI常量创建一个文件,在这个文件中,我希望为我正在使用的每个图像创建最终变量。因此,我的字段声明如下向上箭头是: public static final Image UP_ARROW; 然后我尝试在ImageIOAPI时加载它们,如下所示: static { UP_ARROW = ImageIO.read(new File("img/upArrow.png")); } 不幸的是,这不是
Image
类的问题,但我想让它尽可能广泛地适用
基本上,情况是这样的。我正在为GUI常量创建一个文件,在这个文件中,我希望为我正在使用的每个图像
创建最终变量。因此,我的字段声明如下向上箭头
是:
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;
}
}
现在,不管怎样,向上箭头
必须填充我的图像或null
。我准备宣布胜利,继续前进。但现在我遇到另一个意外的编译器错误:
。。。又失败了,编译器
因此问题就来了:有没有办法绕过这个问题,这样我就可以在运行时动态加载final字段?还是我宣布失败,只是让图像
非最终
另外,解释编译器为什么不允许这样做也会有帮助。据我所知,根据上面的代码,
向上箭头
对象在到达catch{}
块之前不可能被分配,因为这一定是引发异常的原因。因此,如果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
块中可能是有意义的。NPE的答案很好,但我认为这一个(基于他的和)更好:
这解决了您的问题,并为您提供了enum
优于静态final
变量的所有优势
public enum Arrows {
UP ("img/upArrow.png"),
DOWN ("img/downArrow.png"),
LEFT ("img/leftArrow.png"),
RIGHT ("img/rightArrow.png");
public final Image myImage;
private Arrows(String fileName) {
Image tempImage;
try {
tempImage = ImageIO.read(new File(fileName));
} catch (IOException e) {
tempImage = null;
}
myImage = tempImage;
}
}