>source

작업이 주어졌는데 어떻게 해야 하는지 잘 모르겠습니다. 모든 테스트 케이스를 통과해야 합니다.

Assertions.assertDoesNotThrow(() -> p3.equals(null));
    Assertions.assertFalse(p3.equals(null), "equals to null should return false");

나는 첫 번째 것을 알아냈고, 나를 속이는 것은 Assertions.assertfalse(p3.equals(null))입니다. 다음과 같이 Point에서 개체 p3를 만들었습니다.

Point p3= new Point(x+1, y-1);

내 Point 클래스에는 다음과 같이 재정의하는 equals 메서드가 있습니다.

@Override
public boolean equals(Object obj) {
    Point p= (Point) obj;
        try {
            if (x != p.x) {
                return false;
            }
            if (y != p.y) {
                return false;
            }
        } catch (NullPointerException e) {
            System.err.println("null");
        }
    return true;
}

언급되지 않은 다른 테스트를 통과하기 위해 이것을 사용했습니다.

public Point(int x, int y) {
    this.x= x;
    this.y= y;
}
public int x() {
    return x;
}
public int y() {
    return y;
}

여기서 x와 y는 0-30 사이의 임의의 정수입니다.

테스트를 실행하면 항상 null과 같은 p3를 반환하여 나를 혼란스럽게 합니다. 나는 그것이 통과 한 객체가 같은 유형 (Point)인지 확인하는 것과 관련이 있다는 것을 알고 있습니다. 다운캐스팅하지만 확실하지 않습니다. 도움을 주시면 감사하겠습니다. 감사합니다!

개체 인스턴스화 식(new ...)은 예외 없이 완료되면 null을 반환하지 않습니다. 나는 두려워, 나는 질문을 이해하지 못한다.

Seelenvirtuose2021-11-24 14:38:58

참고로 p3.equals(null) 검사는 의미가 없습니다. 변수가 null이면 표현식에서 NPE가 발생합니다. null이 아니면 항상 false로 평가됩니다.

Seelenvirtuose2021-11-24 14:40:32

@Seelenvirtuose 아마도 테스트가 작성되는 두 번째 부분 일 것입니다. 따라서 if(!(other instanceof Point)) return false; Point.equals(Object other) 메서드에서.

ernest_k2021-11-24 14:42:09

@Seelenvirtuose, NPE를 처리하기 위해 try catch 블록을 만들었습니다. 나는 질문을 업데이트했습니다. 어쩌면 이 방법이 더 명확합니다. 어쨌든 고마워

Zaid Fanek2021-11-24 14:50:42

equals 방식으로 NPE를 잡지 마십시오!

Seelenvirtuose2021-11-24 14:52:25
  • 이전 php : CodeIgniter를 사용하여 테이블 정렬을 어떻게 합니까?
  • 다음 [DioErrorType.other]: SocketException: macos에서 flutter 앱 실행 시 호스트 조회 실패