3
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

4

7 回答 7

10

两种选择:

  • 使用静态初始化程序块

    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
    }
    

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

于 2012-08-02T12:04:25.160 回答
3

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

public static Image button;

static {
   try {
       button = new Image("images/buttons/0/Button.png");
    } catch(SlickException e) {
        e.printStackTrace();
    }
}
于 2012-08-02T12:03:54.967 回答
2

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

public static final Image button = setImageButt();

public static Image setImageButt(){
   try {
       button = new Image("images/buttons/0/Button.png");
    } catch(SlickException e) {
        e.printStackTrace();
    }
}
于 2012-08-02T12:06:25.223 回答
1

尝试将其放入静态块中

 public static Image button;
    static{
          try {
                button = new Image("images/buttons/0/Button.png");
            } catch(SlickException e) {
            e.printStackTrace();
            }
        }
于 2012-08-02T12:04:33.500 回答
0

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

public class Images {
    public static Image button;

    static{
        try {
            button = new Image("images/buttons/0/Button.png");     
        } catch(SlickException e) {
             e.printStackTrace();
        }
    }
}
于 2012-08-02T12:04:04.003 回答
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。

于 2012-08-02T12:27:51.807 回答
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();
        }   
    }   
}
于 2017-05-05T09:41:59.753 回答