Как проверить, что точка не имеет NaN в качестве параметра в Java

#java

#java

Вопрос:

Я создал класс point в Java:

 public class Point {
    private final float THRESHOLD = (float) 0.0001;
    private final float x;
    private final float y;

    //getter
    public float getX(){return x;}
    public float getY(){return y;}
    
    //constructor
    public Point(float x,float y){this.x = x;this.y = y;}
    
    //equals
    public boolean equals(Object p1) {
    if (p1 != null amp;amp; p1.getClass() == getClass()) {return (Float.floatToIntBits(x) == Float.floatToIntBits(((Point) p1).x))
                ||(Float.floatToIntBits(y) == Float.floatToIntBits(((Point) p1).y)
                ||Math.abs(x - ((Point) p1).x) < THRESHOLD amp;amp; Math.abs(y - ((Point) p1).y) < THRESHOLD);}
        return false;
    }
    
    //toString
    public String toString() {
        return "x="   x   " y="   y;    
    }
}
  

Затем я создал класс rectangle, используя две точки как TopLeft и bottomright:

 public final class Rectangle {

    private final Point topLeft;
    private final Point bottomRight;
    
    //getters
    public Point gettopLeft() {return topLeft;}
    public Point getbottomRight() {return bottomRight;}
    
    //constructor
    Rectangle(Point topLeft,Point bottomRight){this.topLeft = topLeft; this.bottomRight = bottomRight;}
    Rectangle(float topLeftX,float topLeftY,float bottomRightX, float bottomRightY){
        this(new Point(topLeftX,topLeftY),new Point(bottomRightX,bottomRightY));
    }
    
    //equals
    public boolean equals(Object r1) {  
        if (((Rectangle)r1).bottomRight == this.bottomRight amp;amp; 
                ((Rectangle)r1).topLeft == this.topLeft amp;amp;
                r1.getClass() == getClass()) {return true;}
        return false;
    }
        
    //toString
    public String toString() {
        return "topLeft: "   topLeft   " bottomRight"   bottomRight;
    }
    
    //computeArea
    public float computeArea() {
        return Math.abs(
                (topLeft.getX() - bottomRight.getX())*(bottomRight.getY() - topLeft.getY()));   
    }
}
  

Однако мы все знаем, что когда один параметр в точке равен NaN, rectange не должен работать (например, ошибки throw), как его спроектировать? Спасибо.

Комментарии:

1. Rectangle Конструктор может проверить это, используя Float.isNan() который принимает float значение в качестве параметра.

Ответ №1:

Вы можете использовать Float.isNan метод:

 Rectangle(Point topLeft, Point bottomRight){
    if (Float.isNan(topLeft.getX()) || Float.isNan(topLeft.getY()) ||
        Float.isNan(bottomRight.getX()) || Float.isNan(bottomRight.getY())) {
        throw new IllegalArgumentException("Point contains non-numeric coordinate"); 
    } 
    this.topLeft = topLeft; 
    this.bottomRight = bottomRight;
}
  

В качестве альтернативы вы можете инкапсулировать эту проверку в Point класс, добавив метод, который будет возвращать только true в том случае, если обе координаты не являются NaN. Тогда вы сможете вызвать этот метод для обеих точек в Rectangle конструкторе.