integer number too large の原因と直し方
数値リテラルは既定でint型です。longリテラルのLと、intオーバーフローの挙動を扱います。
エラーメッセージの読み方
Main.java:3: error: integer number too large
Main.java- ファイル名
3- 行番号 — javacが異常に気づいた位置。原因の行とは限りません
error- 種別 — コンパイルエラー。実行まで到達しません
integer number too large- 内容 — javacが期待していたもの、または見つけられなかったもの
このエラーが出る典型パターン
パターン1
1 public class Main { 2 public static void main(String[] args) { 3 long population = 8000000000 ; ^ 4 System.out.println(population); 5 } 6 }
Main.java:3: error: integer number too large
数値リテラルは既定でint型です。intの範囲を超える値にはLを付けてlongリテラルにします。
直し方: 8000000000 を 8000000000L にします。
広告
広告スロット(未設定)
パターン2
1 public class Main { 2 public static void main(String[] args) { 3 int big = 3000000000; ^ 4 System.out.println(big); 5 } 6 }
Main.java:3: error: integer number too large
intの上限は約21億(2^31-1)です。それを超える値はintリテラルとして書けません。
直し方: 3000000000 を 2000000000 にします。
パターン3
1 public class Main { 2 public static void main(String[] args) { 3 System.out.println(Integer.MAX_VALUE + 1); ^ 4 } 5 }
出力: -2147483648期待: 2147483646 (コンパイルは通っています)
intの上限に1を足すと最小値に一周します。オーバーフローは例外にならず静かに値が壊れます。
直し方: + を - にします。
パターン4
1 public class Main { 2 public static void main(String[] args) { 3 int[] nums = new int[3000000000 ]; ^ 4 System.out.println(nums.length); 5 } 6 }
Main.java:3: error: integer number too large
配列の要素数として書けるのもintリテラルの範囲までです。ここでも約21億を超える値は書けません。
直し方: 3000000000 を 300 にします。
パターン5
1 public class Main { 2 public static void main(String[] args) { 3 for (int i = 5000000000 ; i < 5; i++) { ^ 4 System.out.println(i); 5 } 6 } 7 }
Main.java:3: error: integer number too large
forの初期化式に書く数値もintリテラルです。上限を超えるとここでも同じエラーになります。
直し方: 5000000000 を 0 にします。
よくある誤解
オーバーフローは例外にならず、静かに値が壊れます。エラーが出ないぶん、こちらのほうが危険です。
まとめ
integer number too largeは初級でつまずきやすい項目です。上の5パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。