Ich arbeite zurzeit mit Datentypen in Java, und wenn ich das richtig verstanden habe, long
akzeptiert der Typ einen Wert zwischen den Bereichen -9.223.372.036.854.775.808 und +9.223.372.036.854.775.807. Wie Sie unten sehen können, habe ich eine long
Variable mit dem Namen erstellt testLong
. Wenn ich jedoch 9223372036854775807 als Wert einfüge, wird folgende Fehlermeldung angezeigt:
Das Literal 9223372036854775807 vom Typ int liegt außerhalb des Bereichs.
Ich weiß nicht, warum es sich um den long
Datentyp als handelt int
.
Hat jemand irgendwelche Ideen?
Code:
char testChar = 01;
byte testByte = -128;
int testInt = -2147483648;
short testShort = -32768;
long testLong = 9223372036854775807;
float testFoat;
double testDouble = 4.940656458412;
boolean testBool = true;
java
int
long-integer
Mathew Donnan
quelle
quelle
Antworten:
Fügen Sie
L
am Ende ein Kapital hinzu :Andernfalls versucht der Compiler, das Literal als zu analysieren
int
, daher die Fehlermeldungquelle
8
oder enthalten darf9
. Entfernen Sie die führenden Nullen.Es ist nicht. Sie sollten lernen, Compiler-Nachrichten zu vertrauen (insbesondere, wenn sie von vernünftigen, modernen Compilern und nicht von alten C / C ++ - Compilern stammen). Während die Sprache, die sie sprechen, manchmal schwer zu entziffern ist, lügen sie dich normalerweise nicht an.
Schauen wir es uns noch einmal an:
Beachten Sie , dass es nicht der Fall ist Ihre Variable erwähnen
testLong
oder die Artlong
überall, es ist also nicht über die Initialisierung. Das Problem scheint an einem anderen Punkt aufzutreten.Lassen Sie uns nun einige Teile der Nachricht untersuchen:
int
sagt uns, dass er etwas alsint
Wert behandeln möchte (was nicht das ist, was Sie wollten!)int
)Ich werde die gemütliche Liste verlassen, um einen Moment über Literale zu sprechen: Literale sind Orte, an denen Sie einen gewissen Wert in Ihrem Code haben. Es gibt
String
Literale,int
Literale,class
Literale und so weiter. Jedes Mal, wenn Sie einen Wert explizit in Ihrem Code erwähnen , handelt es sich um ein Literal.Es nervt Sie also nicht wirklich an der Variablendeklaration, sondern an der Zahl selbst, der Wert ist das, worüber es Sie nervt.
Sie können dies leicht überprüfen, indem Sie dasselbe Literal in einem Kontext verwenden, in dem a
long
und anint
gleichermaßen akzeptabel sind:PrintStream.println
kann entweder einint
oder einlong
(oder so ziemlich alles andere) nehmen. Der Code sollte also in Ordnung sein, oder?Nein . Nun, vielleicht ist es sollte sein, aber nach den Regeln es ist nicht in Ordnung.
Das Problem ist, dass "einige Ziffern" als
int
Literal definiert sind und daher in dem durch definierten Bereich liegen müssenint
.Wenn Sie ein
long
Literal schreiben möchten, müssen Sie dies explizit machen, indem Sie dasL
(oder Kleinbuchstaben) anhängen.l
Ich empfehle jedoch dringend , immer die Großbuchstabenvariante zu verwenden, da es viel einfacher zu lesen und schwerer mit a zu verwechseln ist1
.Beachten Sie, dass ein ähnliches Problem bei
float
(postfixF
/f
) unddouble
(postfixD
/d
) auftritt .Randnotiz: Sie werden feststellen, dass es keine
byte
odershort
Literale gibt und Sie können weiterhin Werte (normalerweiseint
Literale)byte
undshort
Variablen zuweisen. Dies ist aufgrund spezieller Regeln in § 5.2 über Zuweisungskonverter möglich : Sie ermöglichen die Zuweisung von konstanten Ausdrücken eines größeren Typs aufbyte
,short
,char
oderint
wenn die Werte innerhalb der Arten liegen.quelle
Versuchen Sie es
9223372036854775807L
. DasL
am Ende sagt Java, dass9223372036854775807
along
.quelle
Ich hatte dieses Problem in der Vergangenheit und habe es behoben, indem ich den Wert in die wissenschaftliche Form geschrieben habe. beispielsweise:
quelle
Beide verwenden, aber jeweils nur einen Groß- oder Kleinbuchstaben l.
Warum L / L verwenden? Weil long ein Teil des integralen Datentyps ist.
quelle