Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 动态加载了可能的异常的对象是否可以声明为final?_Java_Variables_Dynamic_Exception Handling_Final - Fatal编程技术网

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;
    }
}