2011-08-17 34 views
68

Tôi đang làm việc với các kiểu dữ liệu tại thời điểm trong Java và nếu tôi đã hiểu chính xác loại long chấp nhận giá trị giữa các phạm vi: -9,223,372,036,854 đến +9,223,372,036,854,775,807. Bây giờ khi bạn có thể xem dưới đây tôi đã tạo ra một biến dài gọi testLong, mặc dù khi tôi chèn 9223372036854775807 như giá trị, tôi nhận được một lỗi nêu:Chữ xyz loại int nằm ngoài phạm vi

"hiểu theo nghĩa đen 9223372036854775807 của kiểu int là ra khỏi phạm vi."

Tôi không biết lý do tại sao nó được đề cập đến loại long dữ liệu như một ai int

có bất kỳ ý tưởng?

mã bên dưới:

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

Nhân tiện: bạn đang sử dụng trình biên dịch nào? Cả Eclipse và trình biên dịch JDK của Sun đều cung cấp các thông báo lỗi khác nhau (theo ý kiến ​​của tôi) cho vấn đề này. –

Trả lời

151

Thêm một vốn L đến cùng:

long value = 9223372036854775807L; 

Nếu không, trình biên dịch sẽ cố gắng phân tích văn chương như một int, vì thế mà thông báo lỗi

+0

Cảm ơn, tại sao điều này lại cần thiết? –

+3

Đó là thông số kỹ thuật ngôn ngữ Java. Tìm toàn văn [tại đây] (http://java.sun.com/docs/books/jls/second_edition/html/lexical.doc.html) –

11

Thử làm 9223372036854775807L

+0

tuyệt vời. ! cảm ơn bạn rock! – ralphgabb

38

Tôi không biết lý do tại sao nó được đề cập đến các kiểu dữ liệu miễn là một int

Nó không phải là. Bạn nên học cách tin cậy các thông điệp trình biên dịch (đặc biệt là khi chúng từ các trình biên dịch hiện đại, không biên dịch và không phải trình biên dịch C/C++ cổ). Trong khi ngôn ngữ mà họ nói có thể khó giải mã vào những thời điểm, họ thường không nói dối bạn.

Hãy nhìn vào nó một lần nữa:

Các đen của int 9223372036854775807 là ra khỏi phạm vi.

Lưu ý, rằng nó không đề cập đến biến của bạn testLong hoặc loại long bất cứ nơi nào, do đó, nó không về khởi tạo. Vấn đề dường như xảy ra ở một số điểm khác.

Bây giờ cho phép điều tra một số các bộ phận của thông điệp: (! Mà không phải là những gì bạn muốn)

  • int cho chúng ta biết rằng anh muốn đối xử với một cái gì đó như một giá trị int
  • "ra khỏi phạm vi "là khá rõ ràng: một cái gì đó không phải là trong phạm vi dự kiến ​​(có lẽ là của int)
  • " chữ ": bây giờ đó là thú vị: một chữ là gì?

Tôi sẽ để lại danh sách ấm cúng để nói về văn học trong giây lát: literals là nơi bạn có một số giá trị trong mã của mình. Có String literals, int literals, class literals và v.v.Mỗi khi bạn đề cập đến một giá trị rõ ràng trong mã của mình, đó là một chữ.

Vì vậy, nó không thực sự dai dẳng bạn về tuyên bố biến, nhưng số lượng chính nó, giá trị là những gì nó dai dẳng bạn về.

Bạn có thể dễ dàng xác minh điều này bằng cách sử dụng cùng một chữ trong một bối cảnh mà một long và một int là như nhau có thể chấp nhận:

System.out.println(9223372036854775807); 

PrintStream.println có thể mất một trong hai an int hoặc a long (hoặc khá nhiều bất cứ điều gì khác). Vì vậy, mã nên được tốt, phải không?

Không. Có thể là nên, nhưng theo quy tắc, không ổn.

Vấn đề là that "some digits" is defined to be an int literal và do đó phải nằm trong phạm vi được xác định bởi int.

Nếu bạn muốn viết một long đen, sau đó bạn phải chắc rằng rõ ràng bằng cách thêm các L (hoặc thấp hơn trường hợp l, nhưng tôi cao đề nghị bạn luôn luôn sử dụng các biến thể chữ hoa, bởi vì nó dễ dàng hơn để đọc và khó hơn để nhầm lẫn với một số 1).

Lưu ý rằng một vấn đề tương tự xảy ra với float (postfix F/f) và double (postfix D/d).

Side lưu ý: bạn sẽ nhận ra rằng không có byte hoặc short literals và bạn vẫn có thể gán giá trị (thường int literals) để byteshort biến: đó là có thể do quy tắc đặc biệt trong § 5.2 about Assignment Converson: chúng cho phép chuyển nhượng liên tục các biểu thức của loại lớn hơn là byte, short, char hoặc intnếu giá trị nằm trong phạm vi loại.

+3

Nơi nào bạn dành thời gian từ ;-) –

+3

@Lukas: Tôi thỉnh thoảng viết câu trả lời như vậy với hy vọng rằng tôi sẽ không phải viết 300 câu trả lời ngắn hơn cho nó ;-) Ngoài ra: giúp giải thích thông báo lỗi (hy vọng) có nghĩa là ít hơn "thông báo lỗi đó có nghĩa là" câu hỏi. –

+0

câu trả lời của bạn rất tốt ... không nghi ngờ gì, đó là lý do tại sao bỏ phiếu, nhưng hãy chỉnh sửa nó và ở trên cùng (bắt đầu câu trả lời của bạn), chỉ viết 1 dòng giải pháp chính xác cho vấn đề và sau đó giải thích. Bởi vì rất nhiều người tìm kiếm giải pháp nhanh hơn là giải thích sâu sắc –

0

Tôi đã gặp vấn đề này trong quá khứ và tôi đã khắc phục điều đó bằng cách viết giá trị theo dạng khoa học. ví dụ:

double val = 9e300; 
Các vấn đề liên quan