Конструктор 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));
}
Что в мире здесь происходит? Существуют ли другие Shape
, которые вызывают зависание конструктора Area
?
Основной вопрос: игнорирование CubicCurve2D
, QuadCurve2D
и Path2D
объектов с Double.POSITIVE_INFINITY
или Float.POSITIVE_INFINITY
для любой координаты (я буду иметь дело с такими как случай края), могу ли я безопасно Предположим, что конструктор Area
никогда не зависнет?
Обратите внимание, что я не могу применить стандартные методы отладки к этой проблеме, потому что у меня нет доступа к исходному коду Oracle Area
, поэтому все, что я могу сделать, это рассматривать его как черный ящик. Мне интересно, есть ли другие известные входные данные, которые вызывают зависание этого черного ящика.
Пожалуйста, не говорите, что это бессмысленный вопрос, потому что ни один здравомыслящий человек не написал бы этот код ... У меня есть приложение, которое выполняет случайно сгенерированный код Java, и это на самом деле проблема. Пожалуйста, также не предлагайте мне запускать код в отдельном процессе и завершать его через некоторое время, потому что этот подход слишком медленный для моих нужд.