3

最初はクラスだけで質問するつもりでしたがImage、できるだけ広く適用できるようにしたいと思いました。

基本的に、これがシナリオです。GUI定数のファイルを作成しています。このファイルには、Image使用している各sの最終変数が必要です。したがって、私のフィールドは次のように宣言されますUP_ARROW

public static final Image UP_ARROW;

ImageIO次に、次のように、APIのときにそれらをロードしようとします。

static {
    UP_ARROW = ImageIO.read(new File("img/upArrow.png"));
}

残念ながら、これは有効でコンパイル可能なコードではありません。これは、明示的throws IOExceptionに処理する必要があるためです。だから私はそれを変更し、try /catchで囲みます:

static {
    try {
        UP_ARROW = ImageIO.read(new File("img/upArrow.png"));
    }
    catch(IOException ioe) {
        //TODO
    }
}

今、私は別のコンパイラエラーを受け取ります。今回は、フィールドが初期化されていない可能性があるとのことです。さて、それは理にかなっています。コンパイラー、私にそれを指摘してくれてありがとう。それは簡単な修正のようです:

static {
    try {
        UP_ARROW = ImageIO.read(new File("img/upArrow.png"));
    }
    catch(IOException ioe) {
        UP_ARROW = null;
    }
}

さて、何があっUP_ARROWても、は私の画像またはのいずれかを入力する必要がありますnull。私は勝利を宣言して先に進む準備ができています。しかし今、私はの予期しないコンパイラエラーを受け取ります:

最後のフィールドUP_ARROWはすでに割り当てられている可能性があります

...再び失敗しました、コンパイラ!

したがって、質問:実行時に最終フィールドを動的にロードできるように、これを回避する方法はありますか?それとも、敗北を宣言して、単にImagesを非ファイナルにするのですか?

また、コンパイラがこれを許可しない理由についての説明も役立ちます。私が理解しているように、上記のコードに基づいて、ブロックに到達する前にUP_ARROWオブジェクトを割り当てることはできませんでした。これは、例外をスローしたに違いないためです。したがって、実行が正常に実行された場合、割り当ては1つだけ行われます。正常に実行されない場合でも、割り当ては1つだけ行われます。どうしてそれは有効ではないのですか?catch{}try{}

4

2 に答える 2

4

以下はそれを行う必要があります:

static {
    Image up_arrow = null;
    try {
        up_arrow = ImageIO.read(new File("img/upArrow.png"));
    }
    catch(IOException ioe) {
        // log the error?
    }
    UP_ARROW = up_arrow;
}

finally最終的な割り当てをブロックで囲むことは理にかなっているかもしれません。

于 2012-11-27T22:24:17.013 に答える
1

NPEの答えは良いですが、これは(彼とに基づいて)より良いと思います:

public enum Arrows {
    UP ("img/upArrow.png"),
    DOWN ("img/downArrow.png"),
    LEFT ("img/leftArrow.png"),
    RIGHT ("img/rightArrow.png");

    public final Image myImage;

    private Arrows(String fileName) {
        Image tempImage;
        try {
            tempImage = ImageIO.read(new File(fileName));
        } catch (IOException e) {
            tempImage = null;
        }
        myImage = tempImage;
    }
}

これにより、問題が解決され、変数に対するすべての利点が得enumられます。static final

于 2012-11-27T22:34:49.843 に答える