我正在使用递归调用实现一个简单的种子填充算法。问题是它在递归调用上抛出了这个异常:
线程中的异常" AWT-EventQueue-0" java.lang.StackOverflowError的
我试图只填充小空格,因此堆栈大小不应该成为问题。有人可以弄清楚,为什么会抛出异常?
种子填充类
package rasterops;
import rasterdata.RasterImage;
import java.awt.*;
import java.awt.image.Raster;
import java.util.List;
import java.util.ArrayList;
import java.util.Optional;
public class SeedFill<PixelType> {
public RasterImage fill(final RasterImage<PixelType> img, final int x, final int y, PixelType borderColor, PixelType fillColor, PixelType bcgColor) {
RasterImage<PixelType> result = img;
PixelType color = (PixelType) img.getPixel(x,y);
if(bcgColor == color || color != borderColor){
result = result.withPixel(x,y, fillColor);
fill(img, x+1, y, borderColor, fillColor,bcgColor);
fill(img, x-1, y, borderColor, fillColor,bcgColor);
fill(img, x, y+1, borderColor, fillColor,bcgColor);
fill(img, x, y-1, borderColor, fillColor,bcgColor);
}
return result;
}
}
在Canvas中使用fill()方法
if(tool == 3){
rasterImage = seedfill.fill(rasterImage, e.getX(), e.getY(), 0xffff00, 0x00ff00, 0x2f2f2f);
panel.repaint();
}
答案 0 :(得分:0)
我相信你的递归基础案例存在问题。
这是你的if语句:bcgColor == color || color != borderColor
这意味着无论borderColor是什么,如果bcgColor与颜色相同,您将开始填充。
我认为您希望这是bcgColor == color && color != borderColor
因为你想在开始递归之前知道这两个条件都是真的,而不是两者都是假的,这是或者语句必须是假的。