2016-02-26 27 views
3

我正在尝试为最终图像创建一个枚举,其中变量'image'将从文件中加载。如果发生IOException,我想将'image'设置为null。但是,根据编译器的说法,当catch块运行时,可能会或可能不会设置“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块中将图像分配给null尚未设置?

回答

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中设置最终变量,而不用使用临时变量来解决问题。

+0

这就是我会这样做的。它重构代码以突破加载图像的逻辑,将值分配给实例字段。我会更进一步,将方法移出enum类并进入实用类(方法和代码都不会与枚举有关)。相比之下,在构造函数中使用临时变量是一个糟糕的解决方案。 – Bohemian

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

我想过使用临时变量,但感觉应该有一个更清晰的方法来解决这个问题。 – XeroOl