2016-04-28 16 views
0

Ich bin neu in der Fehlerbehandlung. Ich habe Probleme mit der variablen Initialisierung. Es funktioniert gut, solange die Bilder vorhanden sind, aber wenn ich absichtlich einen falschen Pfad lade, erhalte ich die folgende Fehlermeldung unten.Initialisierung statischer Variablen in der abstrakten Klasse und Unterklasse

Also meine Vermutung ist, wenn ich die Initialisierung der statischen Methoden korrekt beheben, dann wird das Problem gelöst werden.

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

Dies ist die abstrakte Klasse Stück.

public abstract class Piece { 
protected static BufferedImage warningImage; 
protected static BufferedImage myImage; 


static { 
try { 
    warningImage = ImageIO.read(ChessFrame.class.getResource("/resources/icons/warning.png")); 

} 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); 
} 
myImage = warningImage; 
} 
public BufferedImage getImage(){ 
return myImage; 
} 
+0

Da Sie bereits einen Stack-Trace mit ** Zeilennummern ** haben, würde es hilfreich sein, diese Zeile in Ihrem Quellcode zu markieren. Randnotiz zur Code-Qualität: Es ist eine schlechte Idee, statische und "objektbezogene" Sachen zu mischen. Bedeutung: Ihre Methode 'getImage()' könnte statisch sein; da es nur ein statisches Objekt zurückgibt. Die Tatsache, dass Sie es nicht statisch gemacht haben, ist möglicherweise verwirrend. Und nur um klar zu sein: Eigentlich solltest du versuchen, statisches Zeug zu vermeiden; da dies das Komponententesten erschwert oder unmöglich macht. – GhostCat

+0

Manchmal ist es in Ordnung, deine App sterben zu lassen. Verwenden Sie JOptionPane, um eine Nachricht anzuzeigen: "Ressource x konnte nicht geladen werden. Programmende" und dann System.exit (-1); – ControlAltDel

+0

Fehlt der führende Schrägstrich in 'resources/icons/bishop_black.png'? –

Antwort

0

Das Problem in Ihrem Code ist, dass Sie nur die IOException in Ihrem initializers holen, aber Sie haben nicht die Nullpointer fangen. Dies liegt wahrscheinlich daran, dass die IOException aktiviert ist, während die NullPointerException deaktiviert ist, sodass Ihre IDE Ihnen nicht sagt, dass sie hier auftreten könnte.

Hintergrund: Class.getResource() auf einer nicht vorhandenen Ressource wird null zurückgeben, und da Sie sein Ergebnis nicht überprüfen, übergeben Sie null an ImageIO.read, das abhebt.

So haben Sie folgende Möglichkeiten (wenn Sie initializers halten wollen, das ist ...)

Entweder fangen Nullpointer zusammen mit dem IOException:

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

oder überprüfen Sie das Ergebnis getResource zuerst:

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); 
} 
Verwandte Themen