반환 null; 예외가 잡힐 수 있기 때문에 필요하지만 그러한 경우에는 이미 null인지 확인했기 때문에 (그리고 우리가 호출하는 클래스가 복제를 지원한다는 것을 알고 있다고 가정) try 문이 절대 실패하지 않을 것임을 알 수 있습니다.
try진술이 결코 실패 할 수 없다는 것을 알고있는 방식으로 관련된 입력에 대한 세부 사항을 알고 있다면 그것을 갖는 요점은 무엇입니까? try모든 것이 항상 성공할 것이라는 것을 알고 있다면 피하십시오 (코드베이스의 전체 수명 동안 절대적으로 확신 할 수있는 경우는 드뭅니다).
어쨌든 컴파일러는 안타깝게도 마인드 리더가 아닙니다. 그것은 함수와 그 입력을보고, 그것이 가지고있는 정보가 주어지면, return당신이 가지고있는 것처럼 맨 아래에 그 문이 필요합니다.
구문을 충족하고 컴파일 오류를 피하기 위해 끝에 추가 return 문을 넣는 것이 나쁜 습관입니까 (주석에 도달하지 않을 것임을 설명하는 주석 포함), 아니면 이와 같은 코드를 작성하는 더 좋은 방법이 있습니까? return 문이 필요하지 않습니까?
정반대로, 컴파일러 경고를 피하는 것이 좋습니다. 예를 들어 코드 한 줄이 추가로 드는 경우에도 마찬가지입니다. 여기서 줄 수에 대해 너무 걱정하지 마십시오. 테스트를 통해 기능의 신뢰성을 확립 한 후 계속 진행하십시오. return문장을 생략 할 수 있다고 가정하고, 1 년 후 해당 코드로 돌아온 것을 상상 한 다음 return, 맨 아래에있는 해당 문장이 가능한 가정으로 인해 생략 된 이유에 대한 세부 사항을 자세히 설명하는 일부 주석보다 더 많은 혼란을 유발할 것인지 결정하십시오. 입력 매개 변수에 대해 확인하십시오. 아마도 그 return진술은 다루기가 더 쉬울 것입니다.
즉,이 부분에 대해 구체적으로 설명합니다.
try {
return a.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
...
return null;
여기 예외 처리 사고 방식에 약간 이상한 점이 있다고 생각합니다. 일반적으로 응답으로 할 수있는 의미있는 작업이있는 사이트에서 예외를 삼키기를 원합니다.
try/catch트랜잭션 메커니즘으로 생각할 수 있습니다 . try이러한 변경 작업이 실패하고 catch블록 으로 분기되는 catch경우 롤백 및 복구 프로세스의 일부로 이에 대한 응답 으로이 작업을 수행합니다 (블록에있는 모든 작업).
이 경우 단순히 스택 트레이스를 인쇄 한 다음 강제로 null을 반환하도록하는 것은 트랜잭션 / 복구 사고 방식이 아닙니다. 코드는 오류 처리 책임을 모든 코드 호출에 전달 getClone하여 수동으로 실패를 확인합니다. 당신은 CloneNotSupportedException그것을 잡아서 더 의미있는 다른 형태의 예외로 변환하고 그것을 던지는 것을 선호 할 수 있지만, 이것은 트랜잭션 복구 사이트와 같지 않기 때문에 단순히 예외를 삼키고 null을 반환하고 싶지는 않습니다.
예외를 던지면 이것을 피할 때 수동으로 실패를 확인하고 처리하기 위해 호출자에게 책임이 누출됩니다.
파일을로드하는 것과 비슷합니다. 이는 높은 수준의 트랜잭션입니다. try/catch거기있을 수도 있습니다 . trying파일을로드하는 동안 개체를 복제 할 수 있습니다. 이 상위 수준 작업 (파일로드)에서 오류가 발생하는 경우 일반적으로이 최상위 트랜잭션 try/catch블록 까지 예외를 발생시켜 파일로드 오류로부터 정상적으로 복구 할 수 있습니다 ( 복제 또는 기타 오류로 인해). 따라서 우리는 일반적으로 이와 같은 세분화 된 장소에서 예외를 삼키고 나서 null을 반환하는 것을 원하지 않습니다. 예를 들어 예외의 많은 가치와 목적을 무너 뜨리기 때문입니다. 대신 우리는 의미있게 처리 할 수있는 사이트로 예외를 전파하고 싶습니다.
Object매개 변수를 사용합니다. 경우a지지대 클래스없는clone방법을 (또는이에 정의Object?) 또는 오류가 발생했을 경우clone법 (또는 내가 지금 생각할 수있는 다른 실수), 예외가 발생 될 수 있으며 당신이 도달 할 것이라고는 반환 문.