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

2つのオプション:

  • 静的初期化ブロックを使用する

    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
    }
    

個人的には、これが良い考えであることに少し懐疑的ですが、型の初期化を「実際の作業」で行うと、追跡が難しいバグが発生する可能性があります。問題が発生した場合にnullになるように、すべての参照コードが実際に設定されていますか?

于 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 に答える