Code Fix

初級

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 にします。

この問題を解いてみる →

よくある誤解

オーバーフローは例外にならず、静かに値が壊れます。エラーが出ないぶん、こちらのほうが危険です。

実務での勘所

この検査はリテラルを書いた時点でjavacが行う静的なチェックで、実行時のオーバーフローとは別物です。int同士の演算がint型の範囲(約21億)を超えると、コンパイルエラーにはならずに黙って符号が反転します(2の補数表現による折り返し)。そのためint a = 2147483647; a = a + 1;は普通にコンパイル・実行でき、結果はマイナスの最小値になります。リテラルの書き間違いはコンパイル時に守られますが、計算結果のオーバーフローは自分でチェックする以外に防ぐ方法がありません。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)