2016-04-28 10 views
0

エラー処理が初めてです。私は変数の初期化に問題があります。画像が存在する限り正常に動作しますが、意図的に間違ったパスをロードすると、以下のエラーメッセージが表示されます。抽象クラスとサブクラスでの静的変数の初期化

静的メソッドの初期化を正しく修正すると、問題は解決します。

Exception in thread "main" java.lang.ExceptionInInitializerError 
at Board.placeBishops(Board.java:149) 
at Board.createNewBoard(Board.java:64) 
at RunGame.main(RunGame.java:19) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:497) 
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) 


    Caused by: java.lang.IllegalArgumentException: input == null! 
at javax.imageio.ImageIO.read(ImageIO.java:1388) 
at Bishop.<clinit>(Bishop.java:24) 


public class Bishop extends Piece{ 
private static BufferedImage whiteBishopImage; 
private static BufferedImage blackBishopImage; 

static { 
try { 
    whiteBishopImage = ImageIO.read(ChessFrame.class.getResource("/resources/icons/bishop_white.png")); 
    blackBishopImage = ImageIO.read(ChessFrame.class.getResource("resources/icons/bishop_black.png")); 
} 
catch (IOException e) { 
    e.printStackTrace(); 
    whiteBishopImage = warningImage; 
    blackBishopImage = warningImage; 
    RunGame.getLogger().log(Level.WARNING, "Failed to load Bishop image"); 
} 


} 
@Override public BufferedImage getImage() { 
if (color == PieceColor.WHITE){ 
    return whiteBishopImage; 
} 
else return blackBishopImage; 
} 

これは抽象クラスです。

+0

すでに**行番号**のスタックトレースがあるので、その行をソースコードにマークすると役立ちます。コード品質に関する副題:静的なものと「オブジェクトごとの」ものを混在させることは悪い考えです。意味:あなたのメソッド 'getImage()'は静的である可能性があります。静的オブジェクトを返すだけであるためです。あなたがそれを静的にしていないという事実は、潜在的に混乱しています。実際には、静的なものは避けてください。単体テストをより困難にするか不可能にするからです。 – GhostCat

+0

あなたのアプリを死なせても大丈夫です。 JOptionPaneを使用してメッセージを表示します。「リソースx。プログラム終了」、System.exit(-1)をロードできませんでした。 – ControlAltDel

+0

'resources/icons/bishop_black.png'の先頭にスラッシュがありませんか? –

答えて

0

コードの問題は、イニシャライザでIOExceptionだけをキャッチしているが、NullPointerExceptionをキャッチしないことです。これはおそらく、IOExceptionがチェックされているのに対し、NullPointerExceptionがチェックされていないため、ここで発生する可能性があることをIDEが通知しないためです。

背景:存在しないリソース上のClass.getResource()はnullを返し、その結果をチェックしないので、ImageIO.readにnullを渡します。これは咳をします。

try { 
    warningImage = ImageIO.read(ChessFrame.class.getResource("/resources/icons/warning.png")); 
} catch (IOException | NullPointerException e) { 
    e.printStackTrace(); 
    JOptionPane.showMessageDialog(null, "Failed to load warning image,application will be shutdown"); 
    RunGame.getLogger().log(Level.WARNING, "Failed to load warning image, application was shutdown"); 
    System.exit(1); 
} 

かの結果を確認してください。

だから、あなたは、次のオプション(あなたが初期化子に固執する場合、それは...である)

どちらかのIOExceptionと一緒にキャッチNullPointerExceptionが持っていますgetResource first:

try { 
    URL imageResource = ChessFrame.class.getResource("/resources/icons/warning.png"); 
    if(imageResource != null) { 
     warningImage = ImageIO.read(imageResource); 
    } else { 
     // do something useful 
    } 
} catch (IOException e) { 
    e.printStackTrace(); 
    JOptionPane.showMessageDialog(null, "Failed to load warning image,application will be shutdown"); 
    RunGame.getLogger().log(Level.WARNING, "Failed to load warning image, application was shutdown"); 
    System.exit(1); 
} 
関連する問題