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;
}
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
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
Fehlt der führende Schrägstrich in 'resources/icons/bishop_black.png'? –