检测构造函数中的final是否为空

时间:2016-02-26 02:59:50

标签: java constructor try-catch final

我正在尝试为最终图像创建一个枚举,其中变量'image'将从文件加载。如果发生IOException,我希望'image'设置为null。但是,根据编译器,当catch块运行时,可能会设置“image”,也可能不会设置“image”。

public enum Tile {
    GROUND("ground.png"), WALL("wall.png");
    final Image image;
    Tile(String filename) {
        try {
            image = ImageIO.read(new File("assets/game/tiles/" + filename));
        } catch (IOException io) {
            io.printStackTrace();
            image= null; // compiler error 'image may already have been assigned'
        }
    }
}

需要在构造函数中设置最终变量,因此如果由于某种原因无法读取图像,则必须将其设置为某个值。但是,无法判断图像是否已实际设置。 (在这种情况下,只有在没有设置图像的情况下才会运行catch块,但是编译器说它可能已经设置了)

有没有办法让我在catch块中将image分配给null,只有它尚未设置?

2 个答案:

答案 0 :(得分:4)

尝试使用本地临时变量:

public enum Tile {
    GROUND("ground.png"), WALL("wall.png");
    final Image image;
    Tile(String filename) {

        Image tempImage;
        try {
            tempImage= ImageIO.read(new File("assets/game/tiles/" + filename));
        } catch (IOException io) {
            io.printStackTrace();
            tempImage= null; // compiler should be happy now.
        }

        image = tempImage;
    }
}

答案 1 :(得分:1)

这是我最终使用的解决方案。它添加了一个方法,以便在ImageIO类找到图像时返回代码,而不会调用catch语句。

public enum Tile {
    GROUND("ground.png"), WALL("wall.png");
    final Image image;
    Tile(String filename) {
        image = getImage(filename);
    }
    Image getImage(String filename) {
        try {
            return ImageIO.read(new File("assets/game/tiles/" + filename));
        } catch (IOException io) {
            io.printStackTrace();
            return null;
        }
    }
}

但是,这实际上并不是检测空白最终变量的方法。我希望看看是否有办法在try / catch中设置最终变量,而不使用临时变量解决问题。