첫 번째 질문에 대해서는 경계 검사가 이론적으로는 일 수 있습니다. 최선의 현대적인 JIT 컴파일러가 (예를 들어, 소스 [인덱스]가 확장 될 때 경계 검사에서 일반적인 하위 표현식 제거를 통해)이를 수행 할 것으로 기대합니다. 늘 그렇듯이 구현 의존적이므로 의존 할 수 없습니다. OTOH 경계 검사가 제거되지 않는 경우에도 그 차이는 사소 할 것입니다. 즉, 이미 캐시 된 메모리 위치를 source.length로 지정하고 두 개의 정수 비교를 수행하므로 오버 헤드가 작습니다.
example2는 좋은 습관이 아닙니다. 예를 들어 예외를 치는 것입니다.하지만 아무 일도 일어나지 않는 것처럼 계속 잡아라. stdout을 면밀히 관찰하지 않는다면 코드에 버그가 있다는 사실을 완전히 놓칠 수도 있습니다.
은 "인덱스"에 대한 유효한 입력으로 간주 내용에 따라 기본적으로 두 가지 일반적인 "좋은"가능성이 있습니다
인덱스 값이을 예상하고 있습니다 범위를 벗어날은 유효한 입력으로 간주됩니다. 에서는 example1과 같이 을 명시 적으로 테스트하고 처리해야합니다. 이 경우 어떠한 예외도 throw하지 않아도됩니다.
범위를 벗어나는 인덱스는 예상치 못한입니다 (따라서 호출 코드의 버그입니다). 코드에서 여기에서 예외가 발생해야합니다. 원하는 경우 자신의 메시지로 예외를 포착하고 다시 throw 할 수 있지만 IndexOutOfBounds 예외가 전파되도록 할 수도 있습니다. 이 예외 처리의 성능에 미치는 영향에 대해 걱정하지 마십시오 - ..... 그냥 버그를 발견하고, 따라서 당신은 프로그램이 "큰 소리로"그것은 가능한 한 빨리 실패 할
[This] (http://www.ssw.uni-linz.ac.at/Research/Papers/Wuerthinger07/Wuerthinger07.pdf) 일부 동료의 종이는 당신에게 흥미로워 야합니다. 나는 그 변화가 핫스팟에 통합되었지만 확실하지 않다고 생각한다.어쨌든 두 번째 예제는 퍼포먼스와 코딩 프랙티스 관점에서 분명히 나쁘다. – Voo
@AlanObject, 경계 검사는 출력에 대한 호출보다 작은 크기의 많은 순서입니다. 대부분의 경우 차이가 없습니다. –