int 유형의 리터럴 xyz가 범위를 벗어났습니다.


90

현재 Java에서 데이터 유형으로 작업하고 있으며 올바르게 이해했다면 유형 long은 -9,223,372,036,854,775,808에서 +9,223,372,036,854,775,807 사이의 값을 허용합니다. 이제 아래에서 볼 수 있듯이 9223372036854775807을 값으로 삽입하면 다음과 같은 오류가 발생하지만 long라는 변수를 만들었습니다 testLong.

int 유형의 리터럴 9223372036854775807이 범위를 벗어났습니다.

long데이터 유형을 int.

누구나 아이디어가 있습니까?

암호:

char testChar = 01;
byte testByte = -128;
int testInt = -2147483648;
short testShort = -32768;
long testLong = 9223372036854775807;
float testFoat;
double testDouble = 4.940656458412;
boolean testBool = true;

그건 그렇고 : 어떤 컴파일러를 사용하고 있습니까? Eclipse와 Sun JDK 컴파일러는 모두이 문제에 대해 다른 오류 메시지를 제공합니다.
Joachim Sauer

답변:


195

L끝에 대문자 추가 :

long value = 9223372036854775807L;

그렇지 않으면 컴파일러는 리터럴을으로 구문 분석하려고 시도 int하므로 오류 메시지가 표시됩니다.


4
Java 언어 사양에 있습니다. 여기
Lukas Eder

@Lukas, 긴 값 = 00000077029062100L; 나에게 동일한 오류가 발생하며 19 자리 미만입니다. 이 던지는 왜 어떤 아이디어 "유형의 문자 0000007702062100L 긴 범위를 벗어"
Santossh Kumhar

1
@SantosshKumhar : 8 진수 리터럴 이며 숫자 8또는 9. 선행 0을 제거하십시오.
Lukas Eder

50

long 데이터 유형을 int로 참조하는 이유를 모르겠습니다.

그렇지 않습니다. 컴파일러 메시지를 신뢰하는 법을 배워야합니다 (특히 고대 C / C ++ 컴파일러가 아닌 정상적이고 현대적인 컴파일러에서 온 경우). 그들이 말하는 언어는 때때로 해독하기 어려울 수 있지만 일반적으로 거짓말을하지 않습니다.

다시 살펴 보겠습니다.

int 9223372036854775807의 리터럴이 범위를 벗어났습니다.

이 점에 유의 하지 않는 당신의 변수 언급 testLong되는 타입 long은, 그래서 어디를 하지 초기화에 대해. 문제는 다른 지점에서 발생하는 것 같습니다.

이제 메시지의 일부를 조사해 보겠습니다.

  • int그가 무언가를 int가치 로 취급하고 싶다고 말합니다 (원하는 것이 아닙니다!)
  • "범위를 벗어남"은 매우 명확합니다. 무언가가 예상 범위 내에 있지 않습니다 (아마도의 범위를 벗어남 int).
  • "리터럴": 이제 흥미 롭습니다. 리터럴이 무엇입니까?

잠시 동안 리터럴에 대해 이야기하기 위해 아늑한 목록을 떠날 것입니다. 리터럴은 코드에서 가치가있는 곳입니다. 있다 String리터럴, int리터럴, class등등 리터럴하고. 코드에서 명시 적으로 을 언급 할 때마다 이는 리터럴입니다.

따라서 실제로 변수 선언에 대해 잔소리하는 것이 아니라 숫자 자체, 값이 잔소리하는 것입니다.

a long와 an int이 동일하게 허용되는 컨텍스트에서 동일한 리터럴을 사용하여 쉽게 확인할 수 있습니다 .

System.out.println(9223372036854775807);

PrintStream.printlnanint 또는 along (또는 거의 다른 것)를 취할 수 있습니다 . 그럼 그 코드는 괜찮 겠죠?

아뇨, 어쩌면 한다 , 그러나 규칙에 따라 그것 입니다 잘하지.

문제는 "어떤 자리"는로 정의되는 int문자를 따라서하고 있어야 에 의해 정의 된 범위에 int.

당신이 쓰고 싶은 경우 long문자를, 당신은 추가에 의한 명시해야합니다 L(또는 소문자 l,하지만 난 매우 그것은을 위해 실수로 열심히 읽어 훨씬 쉽게하고 있기 때문에, 당신은 항상 대문자의 변형을 사용하는 것이 좋습니다 1).

float(접미사 F/ f) 및 double(접미사 D/ d) 에서도 유사한 문제가 발생합니다 .

참고 사항 : byte또는 short리터럴 이 없으며 여전히 값 (일반적으로 int리터럴)을 byteshort변수에 할당 할 수 있음을 알게 될 것입니다 . 이는 할당 Converson에 대한 § 5.2의 특수 규칙으로 인해 가능 합니다. 더 큰 유형의 상수 표현식 할당을 허용합니다. 행 byte, short, char또는 int 경우 유형은 범위 내의 값이다.


3
어디 ;-)에서 시간이 걸릴 않습니다
루카스 에델에게

3
@Lukas : 저는 때때로 300 개의 짧은 답을 쓸 필요가 없다는 희망으로 그런 답을 씁니다. ;-) 또한 : 오류 메시지를 해석하는 데 도움이되는 것은 "그 오류 메시지가 의미하는 바"질문이 적다는 것을 의미합니다.
Joachim Sauer 2011 년

귀하의 답변은 매우 좋습니다. 의심 할 여지가 없습니다. 그렇기 때문에 투표를하세요.하지만 수정하고 맨 위에 (답변의 시작 부분) 문제에 대한 정확한 해결책을 한 줄에 적고 설명 아래에 작성하세요. 사람들의 많은 빠른 해결책보다는 깊은 설명을 검색하기 때문에
Shirish Herwade에게

4
그들은 다른 두 번째 답변을 자유롭게 볼 수 있습니다 (가장 많이 득표 한 답변이 빠른 해결책을 제공합니다). 사람들에게 오류 메시지를 구문 분석하고 이해하는 방법을 교육하는 것이 단순히 오류 메시지를 수행하는 것보다 장기적으로 더 유용하다고 생각합니다. "남자에게 물고기를주세요 ..."그리고 그 모든 것.
Joachim Sauer 2015 년

참고에 감사드립니다.
Venkatesh Goud

19

시도해보십시오 9223372036854775807L. L말은 자바를 알려줍니다 9223372036854775807입니다 long.


0

나는 과거에이 문제를 가지고 있었고 과학적 형태로 값을 써서 고쳤습니다. 예를 들면 :

double val = 9e300;

-2
long ak = 34778754226788444L/l;

둘 다 사용하지만 한 번에 하나만 대문자 L 또는 소문자 l을 사용합니다.

왜 L / L을 사용합니까? long은 정수 데이터 유형의 일부이기 때문입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.