【发布时间】:2018-05-12 12:31:40
【问题描述】:
Area(Shape) 构造函数因某些奇怪的Shape 参数而挂起,如下所示。每条注释行都挂起,没有非注释行挂起。我在 Oracle Java 8 和 10 中看到了这种行为。
import java.awt.geom.*;
public static void main(String[] args) {
// new Area(new CubicCurve2D.Double(0, Double.POSITIVE_INFINITY, 0, 0, 0, 0, 1, 0));
new Area(new CubicCurve2D.Double(0, Double.POSITIVE_INFINITY, 0, 0, 0, 0, 0, 0));
new Area(new CubicCurve2D.Double(0, Double.NEGATIVE_INFINITY, 0, 0, 0, 0, 1, 0));
new Area(new CubicCurve2D.Double(0, Double.MAX_VALUE, 0, 0, 0, 0, 1, 0));
new Area(new CubicCurve2D.Double(0, Double.MIN_VALUE, 0, 0, 0, 0, 1, 0));
new Area(new CubicCurve2D.Double(0, Double.NaN, 0, 0, 0, 0, 1, 0));
// new Area(new CubicCurve2D.Double(1, 0, 0, 0, 0, 0, 0, Double.POSITIVE_INFINITY));
new Area(new CubicCurve2D.Double(0, 0, 0, 0, 0, 0, 0, Double.POSITIVE_INFINITY));
// new Area(new QuadCurve2D.Double(0, Double.POSITIVE_INFINITY, 0, 0, 1, 0));
new Area(new QuadCurve2D.Double(0, Double.POSITIVE_INFINITY, 0, 0, 0, 0));
new Area(new QuadCurve2D.Double(0, Double.NEGATIVE_INFINITY, 0, 0, 1, 0));
new Area(new QuadCurve2D.Double(Double.POSITIVE_INFINITY, 0, 0, 0, 0, 1));
// new Area(new QuadCurve2D.Double(1, 2, 3, 4, 5, Double.POSITIVE_INFINITY));
new Area(new QuadCurve2D.Double(0, 1, 2, 3, 4, Double.POSITIVE_INFINITY));
// new Area(new QuadCurve2D.Double(1, 0, 0, 0, 0, Double.POSITIVE_INFINITY));
new Area(new QuadCurve2D.Double(0, 0, 0, 0, 0, Double.POSITIVE_INFINITY));
// new Area(new QuadCurve2D.Float(1, 0, 0, 0, 0, Float.POSITIVE_INFINITY));
new Area(new QuadCurve2D.Float(0, 0, 0, 0, 0, Float.POSITIVE_INFINITY));
Path2D path = new Path2D.Double();
path.moveTo(1, 0);
path.quadTo(0, 0, 0, Double.POSITIVE_INFINITY);
// new Area(path);
new Area(new Line2D.Double(0, Double.POSITIVE_INFINITY, 0, 0));
new Area(new Ellipse2D.Double(0, Double.POSITIVE_INFINITY, 0, 0));
}
这里到底发生了什么?是否还有其他 Shapes 导致 Area 构造函数挂起?
主要问题:忽略 CubicCurve2D、QuadCurve2D 和 Path2D 对象与 Double.POSITIVE_INFINITY 或 Float.POSITIVE_INFINITY 任何坐标(我将处理这些作为边缘情况),我可以安全假设Area 构造函数永远不会挂起?
请注意,我无法将标准调试技术应用于此问题,因为我无法访问 Oracle 的 Area 源代码,所以我只能将其视为黑匣子。我想知道是否还有其他已知的输入会导致这个黑盒挂起。
请不要说这是一个毫无意义的问题,因为没有理智的人会编写此代码...我有一个运行随机生成的 Java 代码的应用程序,这实际上是一个问题。也请不要建议我在单独的进程中运行代码并在超时后将其终止,因为这种方法对我的需要来说太慢了。
【问题讨论】:
-
对于这么复杂的你为什么不使用构建器模式?,只是建议
-
@emotionlessbananas 这有什么关系?你读过这个问题吗?
-
您应该绘制曲线的近似值,以深入了解 Area 对象挂起的原因;我怀疑关闭曲线的算法可能在某些点配置方面遇到了困难。
-
@ReblochonMasque 你能更准确一点吗?我无法访问 Oracle 的 Area 构造函数的源代码,所以我能做的就是推测。请注意,在我的示例中,切换
x和y坐标可能会导致不同的行为,就像将0交换为1。
标签: java geometry awt infinite-loop freeze