【发布时间】:2011-06-09 11:00:21
【问题描述】:
我正在开发一个可运行的 Java 小程序,它具有与 Microsoft Paint 等绘图程序中的填充方法非常相似的填充功能。
这是我的填充方法的工作原理:
小程序使用
.getRGB获取用户点击的颜色小程序创建窗口中所有像素的二维布尔数组,如果该像素与单击的颜色相同,则值为“true”,否则为“false”。此步骤的重点是将
.getRGB方法排除在递归方法之外,以希望防止此错误。小程序递归搜索用户单击的二维布尔数组,并在 ArrayList 中记录每个“真”的相邻点。然后该方法将其记录的每个点更改为 false 并继续。
小程序将存储在
ArrayList中的每个点绘制成用户选择的颜色。
如果用户在一个只有几千像素左右颜色改变的小区域内点击,上述所有步骤都可以完美运行。然而,如果用户选择了一个很大的区域(例如大约 360,000 / 小程序窗口的大小),小程序会进入递归阶段,然后输出此错误:
Exception in thread "AWT-EventQueue-1" java.lang.StackOverflowError
at java.util.ArrayList.add(ArrayList.java:351)
at paint.recursiveSearch(paint.java:185)
at paint.recursiveSearch(paint.java:190)
at paint.recursiveSearch(paint.java:190)
at paint.recursiveSearch(paint.java:190)
at paint.recursiveSearch(paint.java:190)
at paint.recursiveSearch(paint.java:190)
at paint.recursiveSearch(paint.java:190)
(continues for a few pages)
这是我的递归代码:
public void recursiveSearch(boolean [][] list, Point p){
if(isValid(p)){
if(list[(int)p.y][(int)p.x]){
fillPoints.add(p);
list[(int)p.y][(int)p.x] = false;
recursiveSearch(list, new Point(p.x-1,p.y));//Checks to the left
recursiveSearch(list, new Point(p.x,p.y-1));//Checks above
recursiveSearch(list, new Point(p.x+1,p.y));//Checks to the right
recursiveSearch(list, new Point(p.x,p.y+1));//Checks below
}
}
}
有什么办法可以解决这样的错误吗?我知道循环永远不会永远持续下去,它可能会花费很多时间。
【问题讨论】:
标签: java arrays recursion stack-overflow