Java - 在方法外部使用TryCatch

时间:2012-08-02 12:01:55

标签: java

import org.newdawn.slick.Image;
import org.newdawn.slick.SlickException;

public class Images {
    try {
        public static Image button = new Image("images/buttons/0/Button.png");
    } catch(SlickException e) {
    e.printStackTrace();
    }
}

这只是一个错误,我希望能够将一些图像存储在静态变量中并从另一个类访问它们而不实例化它。

我可以创建一个方法来初始化它们并为它们设置值,但是变量不会是静态的。

我需要TryCatch的原因是因为Image类的构造函数抛出SlickException

7 个答案:

答案 0 :(得分:9)

两个选项:

  • 使用静态初始化程序块

    public static final Image button;
    
    static {
        try/catch in here, assign to button
    }
    
  • 使用初始化方法

    public static final Image button = createButton();
    
    private static Image createButton() {
        try/catch in here
    }
    

就个人而言,我有点怀疑这是一个好主意 - 使类型初始化做“真正的工作”可能导致难以追查的错误。在出现问题的情况下,所有引用代码是否真的都设置为空?

答案 1 :(得分:2)

您可以将异常处理代码放在static块中。

public static Image button;

static {
   try {
       button = new Image("images/buttons/0/Button.png");
    } catch(SlickException e) {
        e.printStackTrace();
    }
}

答案 2 :(得分:1)

尝试将其放入静态块

 public static Image button;
    static{
          try {
                button = new Image("images/buttons/0/Button.png");
            } catch(SlickException e) {
            e.printStackTrace();
            }
        }

答案 3 :(得分:1)

只需在块外声明静态变量......它就可以工作..

public static final Image button = setImageButt();

public static Image setImageButt(){
   try {
       button = new Image("images/buttons/0/Button.png");
    } catch(SlickException e) {
        e.printStackTrace();
    }
}

答案 4 :(得分:0)

你应该使用静态构造函数。

public class Images {
    public static Image button;

    static{
        try {
            button = new Image("images/buttons/0/Button.png");     
        } catch(SlickException e) {
             e.printStackTrace();
        }
    }
}

答案 5 :(得分:0)

使用静态块进行初始化,并特别注意不要吞下异常:

public class Images {

    public final static Image BUTTON;
    static {
        Image i;
        try {
            i = new Image("images/buttons/0/Button.png");
        } catch (SlickException e) {
            throw new ExceptionInInitializerError(e);
        }
        BUTTON = i;
    }
}

我从你的代码中纠正了一些事情:

  • 在初始化程序中创建图像意味着它应该是一个常量,因此 final
  • 常量应具有大写名称,因此 BUTTON
  • 不应吞下初始化期间的异常,但应正确指出。否则,您可能需要花费数小时调试未找到的映像,因为没有指示初始化失败。在这种情况下,ExceptionInInitializerError是抛出的标准异常。

还有其他解决方案,但这是最干净的IMO。

答案 6 :(得分:0)

我曾经遇到过类似的问题而在寻找解决方案的过程中,我只是遇到了这个问题。我已经解决了类似的问题,只需将所有代码放在默认构造函数中。

您的解决方案代码如下:

import org.newdawn.slick.Image;
import org.newdawn.slick.SlickException;

public class Images {

    public Images{
        try {
        public static Image button = new Image("images/buttons/0/Button.png");
        } catch(SlickException e) {
            e.printStackTrace();
        }   
    }   
}