2011-08-17 92 views
68

我目前正在使用Java中的數據類型,如果我理解正確,類型long接受的值範圍爲:-9,223,372,036,854到+9,223,372,036,854,775,807。現在,你可以看到下面我創建一個名爲testLong一個長變量,但是當我插入9223372036854775807的值,我得到一個錯誤,指出:int類型的文字xyz超出範圍

「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; 
+0

順便說一句:你使用的是什麼編譯器? Eclipse和Sun JDK編譯器都給出了這個問題的不同(在我看來更好)錯誤消息。 – 2011-08-17 13:28:26

回答

151

添加資金L到最後:

long value = 9223372036854775807L; 

否則,編譯器將嘗試解析文字作爲int,因此錯誤消息

+0

謝謝,爲什麼這需要? – 2011-08-17 12:57:37

+3

它在Java語言規範中。找到全文[這裏](http://java.sun.com/docs/books/jls/second_edition/html/lexical.doc.html) – 2011-08-17 12:59:10

11

試試做 9223372036854775807L

+0

太棒了。 !謝謝你,搖滾! – ralphgabb 2015-07-31 01:19:18

38

我不知道爲什麼它指的是長期的數據類型爲int

它不是。您應該學會信任編譯器消息(特別是當它們來自理智的現代編譯器而不是古老的C/C++編譯器時)。雖然他們說的語言有時可能很難破譯,但他們通常不會對你說謊。

讓我們再看看它:

字面的INT 9223372036854775807超出範圍。

注意,它提到你的變量testLong或類型long任何地方,所以它不關於初始化。這個問題似乎發生在其他一些地方。

現在讓我們來探討一些消息的部分組成:(!這是不是你想要的)

  • int告訴我們,他想要把東西作爲int
  • 「超出範圍「很清楚:有些東西不在預期範圍內(可能是int
  • 」文字「:現在很有意思:什麼是文字?

我會離開舒適的列表來談論文字的片刻:文字是你的代碼中有一些價值的地方。有文字String,文字int,文字class等。每當您在代碼中明確提及時,它都是文字。

所以它實際上並沒有讓你對變量聲明感到嘮叨,而是數字本身,它的價值就在於嘮叨你。

您可以輕鬆地在一個環境中使用相同的文字驗證這一點,其中一個longint都可以接受:

System.out.println(9223372036854775807); 

PrintStream.println可以採取兩種an inta long(或幾乎任何東西)。所以這段代碼應該沒問題吧?

號哦,也許這應該可以,但根據規則它不精。

問題是that "some digits" is defined to be an int literal,因此必須是由int限定的範圍。

如果你想要寫一個long文字,那麼你就必須做出明確通過附加L(或小寫l,但我高度建議你總是使用大寫的變種,因爲它更容易閱讀更難以誤認爲1)。

注意,與float(後綴F/f)和double(後綴D/d)發生類似的問題。

旁註:你會認識到沒有byteshort文字,你仍然可以分配的值(通常int文字),以byteshort變量:這是可能的,因爲特殊的規則§ 5.2 about Assignment Converson:它們允許的不斷分配更大類型的表達爲byteshort,charint如果的值在類型範圍內。

0

我在過去有過這個問題,我通過以科學形式編寫值來解決這個問題。 例如:

double val = 9e300;