Java-在方法外部使用TryCatch

Java-在方法外部使用TryCatch,java,Java,这只是给出了一个错误,我希望能够将一些图像存储在静态变量中,并从另一个类访问它们,而无需实例化它 我可能会创建一个方法来初始化所有这些变量并为它们设置值,但这样变量就不会是静态的 我需要TryCatch的原因是Image类的构造函数抛出一个SlickException您可以将异常处理代码放在静态块中 import org.newdawn.slick.Image; import org.newdawn.slick.SlickException; public class Images {

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

我可能会创建一个方法来初始化所有这些变量并为它们设置值,但这样变量就不会是静态的


我需要TryCatch的原因是
Image
类的构造函数抛出一个
SlickException
您可以将异常处理代码放在
静态块中

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();
    }
}

您应该使用静态构造函数

public static Image button;

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

  • 使用静态初始值设定项块

    public class Images {
        public static Image button;
    
        static{
            try {
                button = new Image("images/buttons/0/Button.png");     
            } catch(SlickException e) {
                 e.printStackTrace();
            }
        }
    }
    
  • 使用方法进行初始化

    public static final Image button;
    
    static {
        try/catch in here, assign to button
    }
    

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

尝试将其放入静态块中

public static final Image button = createButton();

private static Image createButton() {
    try/catch in here
}

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

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

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

public static final Image button = setImageButt();

public static Image setImageButt(){
   try {
       button = new Image("images/buttons/0/Button.png");
    } catch(SlickException e) {
        e.printStackTrace();
    }
}
我从您的代码中更正了一些内容:

  • 在初始值设定项中创建图像意味着它应该是一个常量,因此是final
  • 常量应该有大写的名称,因此按钮
  • 初始化期间的异常不应忽略,但应正确指示。否则,您可能会花费数小时调试找不到映像,因为没有初始化失败的迹象。ExceptionInInitializerError是在这种情况下抛出的标准异常

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

为了找到解决方案,我曾经遇到过类似的问题。我已经解决了类似的问题,只是把所有的代码放在默认构造函数中

public static Image button;

static {
   try {
       button = new Image("images/buttons/0/Button.png");
    } catch(SlickException e) {
        e.printStackTrace();
    }
}
您的解决方案代码如下所示:

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

什么错误?您能给我们提供更多的细节吗?也许还可以添加
最终版
。然后,编译器强制您考虑在该catch块中分配什么。在静态初始值设定项中初始化图像很糟糕,因为您要么吃掉异常,返回null(或whoops img),要么使用以下LinkageError使整个应用程序崩溃,有时会被掩盖和吃掉,而且是意外的。