I'm working on an Java swing application where I'm trying to load the images for the pieces for chess figures, and all have worked very good until suddenly, I got the error:
Exception in thread "main" java.lang.StackOverflowError
at java.base/java.lang.String.indexOf(String.java:1612)
at java.base/java.lang.String.indexOf(String.java:1569)
at java.base/java.net.URLStreamHandler.parseURL(URLStreamHandler.java:151)
at java.base/sun.net.www.protocol.file.Handler.parseURL(Handler.java:67)
at java.base/java.net.URL.<init>(URL.java:696)
at java.base/java.net.URL.<init>(URL.java:563)
at java.base/jdk.internal.loader.URLClassPath$FileLoader.getResource(URLClassPath.java:1222)
at java.base/jdk.internal.loader.URLClassPath$FileLoader.findResource(URLClassPath.java:1211)
at java.base/jdk.internal.loader.URLClassPath.findResource(URLClassPath.java:294)
at java.base/jdk.internal.loader.BuiltinClassLoader.findResourceOnClassPath(BuiltinClassLoader.java:499)
at java.base/jdk.internal.loader.BuiltinClassLoader.findResource(BuiltinClassLoader.java:323)
at java.base/java.lang.ClassLoader.getResource(ClassLoader.java:1400)
at java.base/java.lang.Class.getResource(Class.java:2741)
at model.Board.getImageIcon(Board.java:246)
at model.Board.setBoard(Board.java:49)
at model.Board.<init>(Board.java:37)
at model.Board.getBoardInstance(Board.java:28)
at controler.FigureAction.<init>(FigureAction.java:15)
at model.Figure.<init>(Figure.java:30)
at model.Board.setBoard(Board.java:49)
at model.Board.<init>(Board.java:37)
at model.Board.getBoardInstance(Board.java:28)
at controler.FigureAction.<init>(FigureAction.java:15)
at model.Figure.<init>(Figure.java:30)
at model.Board.setBoard(Board.java:49)
at model.Board.<init>(Board.java:37)
at model.Board.getBoardInstance(Board.java:28)
at controler.FigureAction.<init>(FigureAction.java:15)
at model.Figure.<init>(Figure.java:30)
at model.Board.setBoard(Board.java:49)
at model.Board.<init>(Board.java:37)
at model.Board.getBoardInstance(Board.java:28)
at controler.FigureAction.<init>(FigureAction.java:15)
at model.Figure.<init>(Figure.java:30)
at model.Board.setBoard(Board.java:49)
at model.Board.<init>(Board.java:37)
at model.Board.getBoardInstance(Board.java:28)
at controler.FigureAction.<init>(FigureAction.java:15)
at model.Figure.<init>(Figure.java:30)
at model.Board.setBoard(Board.java:49)
at model.Board.<init>(Board.java:37)
at model.Board.getBoardInstance(Board.java:28)
at controler.FigureAction.<init>(FigureAction.java:15)
at model.Figure.<init>(Figure.java:30)at model.Board.setBoard(Board.java:49)
at model.Board.<init>(Board.java:37)
at model.Board.getBoardInstance(Board.java:28)
at controler.FigureAction.<init>(FigureAction.java:15)
at model.Figure.<init>(Figure.java:30)
at model.Board.setBoard(Board.java:49)
at model.Board.<init>(Board.java:37)
at model.Board.getBoardInstance(Board.java:28)
at controler.FigureAction.<init>(FigureAction.java:15)
at model.Figure.<init>(Figure.java:30)
at model.Board.setBoard(Board.java:49)
at model.Board.<init>(Board.java:37)
at model.Board.getBoardInstance(Board.java:28)
at controler.FigureAction.<init>(FigureAction.java:15)
at model.Figure.<init>(Figure.java:30)
at model.Board.setBoard(Board.java:49)
at model.Board.<init>(Board.java:37)
at model.Board.getBoardInstance(Board.java:28)
at controler.FigureAction.<init>(FigureAction.java:15)
at model.Figure.<init>(Figure.java:30)
at model.Board.setBoard(Board.java:49)
at model.Board.<init>(Board.java:37)
at model.Board.getBoardInstance(Board.java:28)
at controler.FigureAction.<init>(FigureAction.java:15)
at model.Figure.<init>(Figure.java:30)
and the part from at model.Board.setBoard(Board.java:49)
is logged many more times after (only that part).
While debugging the error, I saw that it enters the same method over and over until Stack overflow error occurs. There I'm retrieving the image from a local address.(it all have worked previously..)
Method is following:
private ImageIcon getImageIcon(String path,String description) {
URL imgURL = getClass().getResource(path);
if (imgURL != null) {
Image ii=new ImageIcon(imgURL, description).getImage().getScaledInstance(70, 70, Image.SCALE_SMOOTH);
ImageIcon im=new ImageIcon(ii);
return im;
}
else {
System.err.println("Couldn't find file: " + path);
return null;
}
}
and it is called here
public void setBoard(Color c1,Color c2,Dimension dim) {
for(int i=0;i<8;i++) {
for(int j=0;j<8;j++) {
Point point=new Point(i,j);
if ((i+j)%2==0) {
if(i==0 && j==0) {
***Figure f=new Figure (null,null,"white_rook",null,getImageIcon("/images/WhiteRook.png",null));***
fields[i][j]=new Field(c1,new Position(point.x,point.y),i*8+j,f);
f.field=fields[i][j];
f.pos=new Position(point.x,point.y);
fields[i][j].add(f);
figures[i][j]=f;
}
which is part of method setBoard, which basically places each piece on the field. Figure class looks like:
public class Figure extends JPanel {
public Field field;
public Color color;
public String name;
public Movement movement;
public ImageIcon imageIcon;
public Position pos;
public Figure(Field field, Color color, String name, Movement movement, ImageIcon icon) {
this.field = field;
this.color = color;
this.name = name;
this.movement = movement;
this.imageIcon = icon;
this.setPreferredSize(new Dimension(70, 70));
this.addMouseMotionListener(new FigureAction());
this.addMouseListener(new FigureAction());
this.setBackground(null);
}
}
Here I'm making scaled imageIcon from the png image and retrieving it back. I would be very grateful if someone is able to tell me what could be the problem. I think I'm missing something important here, but currently don't know where else to look at.. Thanks in advance.
According to your stack trace and code provided:
at model.Board.setBoard(Board.java:49)
at model.Board.<init>(Board.java:37)
at model.Board.getBoardInstance(Board.java:28)
at controler.FigureAction.<init>(FigureAction.java:15)
at model.Figure.<init>(Figure.java:30)
which means:
Figure
constructor is called.FigureAction
constructor is called.Board.setBoard
is called.Board.setBoard
calls again the Figure
constructor in the line you just highlighted with 3 asterisks...In order to solve this, it depends on what you are trying to achieve. Which means we need even more code to see (for example an MRE), if you want us to try and solve it.