如何在Java中创建未初始化的静态最终变量

时间:2015-06-28 16:36:17

标签: java variables

下面的代码会产生编译器错误[self.tableView setDoubleAction:@selector(doubleClick:)]; //... - (void)doubleClick:(id)sender { //set your cell to editable mode } (同样适用于Variable HEIGHT might not have been initialized)。

如何声明未初始化的静态最终变量,就像我在下面尝试做的那样?

WIDTH

4 个答案:

答案 0 :(得分:3)

  static {
    Image currentImage = null;
    try {
      currentImage = new Image("res/images/asteroid_blue.png");
    } catch (Exception e) {
      // catch exception - do other stuff
    } finally {
      if (currentImage != null) {
        WIDTH = currentImage.getWidth();
        HEIGHT = currentImage.getHeight();
      } else {
        // initialise default values
        WIDTH = 0;
        HEIGHT = 0;
      }
    }
  }

无论发生什么(try / catch),你必须为静态变量赋值 - 因此,最后应该使用。

答案 1 :(得分:2)

正确的方法是将值设置为null(如果是对象),但由于它是final,您必须执行此回合:

public static final int HEIGHT, WIDTH;
static{
    int w = 0, h = 0;
    try {
        currentImage = new Image("res/images/asteroid_blue.png");
        w = currentImage.getWidth();
        h = currentImage.getHeight();
    }catch (SlickException e){
        e.printStackTrace();
    }

    WIDTH = w;
    HEIGHT = h;  
}

答案 2 :(得分:0)

您可以执行此操作,但需要通过抛出异常退出静态块

  public static final int HEIGHT, WIDTH;
  static{
   try {
      currentImage = new Image("res/images/asteroid_blue.png");
      WIDTH = currentImage.getWidth();
      HEIGHT = currentImage.getHeight();
  }catch (SlickException e){
      e.printStackTrace();
     throw new RuntimeException("Could not init class.", e);    
 }

}

答案 3 :(得分:-2)

你做不到。 final 变量只能在初始化期间分配值,因此您收到编译器错误的原因(变量将保持为null)。它用于确保一致性。

您可以删除final关键字或制作HEIGHT和WIDTH局部变量。

currentImage = new Image("res/images/asteroid_blue.png");
final int width= currentImage.getWidth();
final int height = currentImage.getHeight();