2010-12-27 3 views
3

(정수/Long/...)과 같은 Java 숫자/숫자 데이터 유형이 오버플로 예외를 발생시키지 않는 이유는 무엇입니까? 예를 들어 : 우리는 다음과 같은 사항에 대해 수학적으로 잘못된 답변을 얻을Java Number 데이터 유형이 왜 오버플로되지 않습니까?

Integer val = Integer.MAX_VALUE * 2; 
System.out.println("Max val unexpected" + val); 

** 최대 발 예상치 못한-2 **

내가 아는; 코어에서 이러한 데이터 유형은 원시 자바 데이터 유형을 사용합니다. 그래도 ..ValueOverflowException과 같은 것을 던져 잘못된 대답을 방지하는 것은 좋지 않습니다. 이 동작을 확장하고 추가하는 생각은 있지만이 모든 수업은 최종적입니다.

의견을 게시하십시오. & 의견을 남기십시오.

+0

예제에 대한 답은 무엇입니까? –

+0

이것은 토론 포럼이 아닙니다 ([FAQ] (http://stackoverflow.com/faq) 참조). 명확한 답이없는 이러한 질문은 실제로 여기에 속하지 않습니다. 전혀 나쁜 질문은 아니지만 객관적으로 대답 할 수있는 것이 아닙니다. 설계 결정이었고 오라클 포럼에 대한보다 나은 답변을 얻을 수있었습니다. –

+0

@blob,이 작업을 수행하는 언어가 있습니까? 그것에 대해 생각해보십시오. – st0le

답변

9

이러한 유형은 기본 유형에 대한 래퍼 일 뿐이며 서로 다르게 동작하는 경우 예상하지 못할 수 있습니다. 이러한 유형의 예외를 throw하지 않는 한 가지 이유는 이러한 검사가 수행되는 경우 엄청난 비용이 들며 프로세서의 이러한 정수 유형은 오버플로시 인터럽트를 트리거하지 않습니다 (반대로 부동 소수점 유형은 인터럽트를 트리거 할 수 있음) 다양한 이벤트). 임의 정밀도를 지원하려는 경우 BigInteger 유형에 관심이있을 수 있습니다.

3

사양에 따라 작동하는 방식입니다. 자세한 내용은 Java Specification에서 4.2 - Primitive Types And Values을 확인하십시오.

+0

또는 15.17.1 절 마지막 줄에 '오버플로, 언더 플로우 또는 정보 손실이 발생할 수 있음에도 불구하고 곱셈 연산자 *가 런타임 예외를 throw하지 않습니다.'라는 메시지가 표시됨 – Ishtar

+0

!! 그러한 작업으로 인해 잘못된 결과가 아닌 예외가 발생하면 더 많은 도움이 될 것입니다. 그 이유에 대해 일반적인 견해를 묻는 것입니다. – blob

+0

그것은 까다로운 전화입니다. 나는이 조건들에 예외를 두는 것이 더 도움이 될 것이라는 점에 동의한다. 그러나 그것은 추가적인 테스트를 의미하며 더 많은 CPU 시간을 필요로 할 것이다. 가장 좋은 솔루션 인 IMHO는 오버플로에 대한 예외를 허용하는 JVM 스위치입니다. 그렇게하면 사용자는 느리지 만 더 안전하게 할 것인지 결정할 수 있습니다. –

6

데이터 형식이 오버플로되어 예가 증명합니다. 그들이하지 않는 것은 범람 할 때 예외를 throw하는 것입니다.

Java에서는 예외를 일반적으로 선언해야하며 그렇게 할 때 예외를 잡아야합니다. 네, 이것이 (오류, RuntimeExceptions 등) 개최하지 않는 몇 가지 시나리오가 있지만 이러한 규칙은 예외의 주요에 대한 빠른 개최.

MathOverflowException을 원하면 catch해야합니다. 그렇지 않으면 아무런 도움이되지 않습니다. 즉, 다음과 같은 코드를 작성해야합니다.

try { 
    int x = 5 + 7; 
} catch (MathOverflowException e) { 
    // do something 
} 

이제이 코드는 실제로 불쾌 해집니다. 무엇이 예외를 던집니까? "플러스"표지가 맞지, 그렇지? 글쎄, 일종의. Object on Methods는 예외를 던지므로 더하기 기호는 "object"의 "method"여야합니다. 5.이 특별한 mathimatcal 경우를 제외하고는 객체의 메서드를 역 참조하지 않습니다. 그렇지 않으면 다음과 같이 표시됩니다.

try { 
    int x = 5.+ 7; // Note the dot-plus ".+" 
} catch (MathOverflowException e) { 
    // do something 
} 

그러나이 작업을 시작하면 작동을위한 괄호가 필요합니다.

try { 
    int x = 5.+(7); 
} catch (MathOverflowException e) { 
    // do something 
} 

이렇게하면 "등호"라는 지정이 방법이기도합니다. 그것을 할 필요가 있도록

try { 
    int x.=(5.+(7)); 
} catch (MathOverflowException e) { 
    // do something 
} 

그러나 우리는, "새로운"X를 만들지 않은 : 아마도

try { 
    (new int x()).=(5.+(7)); 
} catch (MathOverflowException e) { 
    // do something 
} 

또는

try { 
    new int x(5).+(7); 
} catch (MathOverflowException e) { 
    // do something 
} 

어느 쪽이든, 그것은에서 멀리 여행이다 간단한 대수학 스타일, Java는 잘 알려진 대수/C-ish/Fortran-ish 구문을 유지하기로 결정했습니다.그렇게함으로써 그들은 객체 지향적 방식으로 수학 구문을 지원하기 위해 숨겨진 "뒷 배경"규칙을 만들 필요가 있는지, 아니면 단순히 수학이 객체 지향이라는 가짜를 없앨 필요가 있음을 신속하게 발견했습니다. 그들은 후자를 선택했다.

+0

우수 설명 !!! – SiB

관련 문제