最初はクラスだけで質問するつもりでしたが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
。私は勝利を宣言して先に進む準備ができています。しかし今、私は別の予期しないコンパイラエラーを受け取ります:
...再び失敗しました、コンパイラ!
したがって、質問:実行時に最終フィールドを動的にロードできるように、これを回避する方法はありますか?それとも、敗北を宣言して、単にImage
sを非ファイナルにするのですか?
また、コンパイラがこれを許可しない理由についての説明も役立ちます。私が理解しているように、上記のコードに基づいて、ブロックに到達する前にUP_ARROW
オブジェクトを割り当てることはできませんでした。これは、例外をスローしたに違いないためです。したがって、実行が正常に実行された場合、割り当ては1つだけ行われます。正常に実行されない場合でも、割り当ては1つだけ行われます。どうしてそれは有効ではないのですか?catch{}
try{}