类型为int的文字xyz超出范围


89

目前,我正在使用Java处理数据类型,如果我正确理解该类型long,则可接受的值介于-9,223,372,036,854,775,808到+9,223,372,036,854,775,807之间。现在,您可以在下面看到,我创建了一个long名为的变量testLong,尽管当我将9223372036854775807插入为值时,我得到了一条错误消息:

类型为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编译器都针对此问题给出了不同的(我认为更好)错误消息。
约阿希姆·绍尔

Answers:


195

L在末尾添加大写字母:

long value = 9223372036854775807L;

否则,编译器将尝试将文字解析为int,因此出现错误消息


4
它在Java语言规范中。在这里
Lukas Eder

@Lukas,长值= 00000077029062100L; 给我同样的错误,并且少于19位数字。任何想法为什么会抛出“ long类型的字面0000007702062100L超出范围”
Santossh Kumhar

1
@SantosshKumhar:这是一个八进制文字,不能包含数字89。删除前导零。
卢卡斯·埃德

49

我不知道为什么它将长数据类型称为int

它不是。您应该学会信任编译器消息(尤其是当它们来自健全,现代的编译器而不是古老的C / C ++编译器时)。尽管他们有时会难以理解所讲的语言,但他们通常不会对您说谎。

让我们再来看一看:

int 9223372036854775807的文字超出范围。

请注意,它在任何地方都没有提及您的变量testLong或类型long,因此与初始化无关。该问题似乎在其他时候发生。

现在让我们研究消息的某些部分:

  • int告诉我们他想将某些东西视为一种int价值(这不是您想要的!)
  • “超出范围”非常清楚:某些内容不在预期范围内(可能是int
  • “文字”:现在很有趣:什么是文字?

我将离开舒适清单,暂时讨论一下文字:文字是在代码中有价值的地方。有String文字,int文字,class文字等。每次在代码中显式提及值时,它都是文字。

因此,它实际上并不是在困扰您关于变量声明,而是数字本身,值就是在困扰您。

您可以通过在a long和an int均可接受的上下文中使用相同的文字轻松地验证这一点:

System.out.println(9223372036854775807);

PrintStream.println可以带一个int一个long(或几乎其他任何东西)。这样的代码应该没问题吧?

不会。也许应该这样,但是根据规则,这样并不好。

问题是“某些数字”被定义为int文字,因此必须在定义的范围内int

如果要编写long文字,则必须通过附加L(或小写字母)使其显式显示l,但我强烈建议您始终使用大写字母,因为它更容易阅读,并且更容易出错1

请注意,float(postfix F/ f)和double(postfix D/ d)也会发生类似的问题。

旁注:您将意识到没有byteor short文字,您仍然可以将值(通常是int文字)分配给byteshort变量:这可能是由于§5.2中有关Assignment Converson的特殊规则:它们允许分配较大类型的常量表达式到byteshortcharint 如果该值是中的类型的范围内。


3
您从哪里抽出时间;-)
卢卡斯·埃德

3
@Lukas:我偶尔会写这样的答案,希望我不必为此写300个简短的答案;
约阿希姆·绍尔

您的答案非常好...毫无疑问,这就是为什么要投票,但请在顶部(答案的开头)对其进行编辑,只需在第一行中写下问题的确切解决方案,然后在您的解释下方进行。因为很多人都在寻求快速解决方案而不是深入的解释
Shirish Herwade

4
他们可以随意查看其他第二个答案(投票最多的答案甚至可以提供快速解决方案)。我认为,从长远来看,教育人们如何解析和理解错误消息比仅仅为他们做的有用。“给男人一条鱼……”等等。
Joachim Sauer'3

感谢旁注。
Venkatesh Goud 2015年

17

尝试做9223372036854775807L。在L末通知Java 9223372036854775807是一个long


0

我过去曾遇到过这个问题,并通过以科学的形式写出了价值来解决了这个问题。例如:

double val = 9e300;

-2
long ak = 34778754226788444L/l;

两者都使用,但一次只能使用大写L或小写l。

为什么要使用L / l?因为long是整数数据类型的一部分。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.