Javaで整数値を扱う際、Integer型の変数がnullとなるケースは少なくありません。
そのような状況で、値の比較を行うには特別な注意が必要です。
この記事では、JavaにおけるIntegerのnullチェックの基本から、安全な比較方法、そしてnullを0に変換する際の検討事項まで、幅広く解説します。
int型変数へのnull代入は可能なのか、Integerにnullは入るのかといった基本的な疑問から、String型におけるnullや空文字との違い、intとIntegerの使い分けまで、Javaプログラミングにおけるnullに関するあらゆる側面を網羅。
数値比較や大小比較でNullPointerExceptionを回避するための実践的なテクニックを身につけ、より堅牢なコードを目指しましょう。

この記事を読むと、次のことがわかります。
- intとIntegerの使い分け
- Integerにおけるnullの扱い方
- 安全なnullチェックと比較方法
- nullを0に変換する際の注意点
本記事の内容
Java Integer 比較 : Null 問題の徹底解説
- intとIntegerはどう使い分けます?
- Integerにnullは入りますか?
- Java Integer null チェックの基本
- 安全な比較方法
- 0 変換の検討
intとIntegerはどう使い分けます?
Javaには、数値を扱う基本的な型としてint
とInteger
が存在します。
これらは似ていますが、明確な違いがあり、適切な使い分けが重要です。
int
はプリミティブ型であり、数値を直接格納します。
一方、Integer
はラッパークラスであり、int
型の値をオブジェクトとして扱います。
使い分けのポイントを表にまとめました。
項目 | int | Integer |
---|---|---|
型 | プリミティブ型 | ラッパークラス |
null値 | 不可 | 可能 |
メモリ消費 | 少ない | 多い |
メソッド | なし | 多数(例:toString, compareTo) |
ジェネリクス | 使用不可 | 使用可能 |
int
は、単純な数値計算や、メモリ効率が重要な場合に適しています。
例えば、ループカウンタや配列のインデックスなどに使用します。
Integer
は、null
値を扱いたい場合や、オブジェクトとして数値を扱いたい場合に便利です。
コレクション(ListやMapなど)で数値を扱う場合や、数値の比較、文字列への変換などのメソッドを利用したい場合に利用します。
例えば、データベースから取得した数値データを扱う場合、値が存在しない場合にnull
が返ってくることがあるため、Integer
を使用します。
ただし、Integer
はint
よりもメモリ消費量が大きく、処理速度も若干遅くなります。
そのため、null
値を扱う必要がない場合は、int
を使用する方が効率的です。
Java 5以降では、オートボクシング/アンボクシングという機能が導入され、int
とInteger
間の変換が自動的に行われるようになりました。
しかし、null
値を含むInteger
をint
にアンボクシングすると、NullPointerException
が発生する可能性があるため、注意が必要です。
したがって、int
とInteger
は、それぞれの特性を理解した上で、適切に使い分けることが大切です。

Integerにnullは入りますか?
結論から言うと、Integer
にはnull
を入れることができます。
これは、Integer
がプリミティブ型ではなく、ラッパークラスであるためです。
ラッパークラスはオブジェクトとして値を扱うため、参照を持たない状態、つまりnull
を表現できます。
int
型はプリミティブ型であり、必ず何らかの値(初期値0)を持ちます。
そのため、int
型変数にnull
を代入しようとすると、コンパイルエラーが発生します。
一方、Integer
は参照型であるため、null
を代入してもコンパイルエラーにはなりません。
Integer
にnull
を代入する例を以下に示します。
Integer num = null;
Integer
にnull
を代入することは可能ですが、注意点もあります。
null
のInteger
オブジェクトに対してメソッドを呼び出したり、int
型にアンボクシングしようとすると、NullPointerException
が発生します。
例えば、以下のようなコードはNullPointerException
を引き起こします。
Integer num = null;
int value = num; // NullPointerExceptionが発生
このようなNullPointerException
を避けるためには、Integer
オブジェクトがnull
でないことを確認してから処理を行う必要があります。
Java Integer null チェックの基本
JavaでInteger
オブジェクトがnull
かどうかをチェックする方法はいくつかあります。
null
チェックを怠ると、NullPointerException
が発生する可能性があるため、Integer
を扱う際にはnull
チェックが不可欠です。
最も基本的な方法は、==
演算子を使用することです。
Integer num = null;
if (num == null) {
// numがnullの場合の処理
System.out.println("num is null");
} else {
// numがnullでない場合の処理
System.out.println("num is not null");
}
この方法はシンプルで理解しやすいですが、null
チェック以外の目的で==
演算子を使用する際には注意が必要です。
Integer
オブジェクトの値を比較する場合は、equals()
メソッドを使用する必要があります。
Java 7以降では、Objects.equals()
メソッドを使用することもできます。
このメソッドは、null
チェックを内部で行ってくれるため、より安全です。
Integer num1 = null;
Integer num2 = 10;
if (Objects.equals(num1, num2)) {
// num1とnum2が等しい場合の処理
} else {
// num1とnum2が等しくない場合の処理
}
Objects.equals()
メソッドは、引数が両方ともnull
の場合はtrue
を、片方がnull
の場合はfalse
を返します。
また、Optional
クラスを使用することも可能です。
Optional
は、値が存在しない可能性のある値を扱うためのクラスです。
Optional<Integer> optionalNum = Optional.ofNullable(num);
if (optionalNum.isPresent()) {
// 値が存在する場合の処理
System.out.println("Value is present: " + optionalNum.get());
} else {
// 値が存在しない(null)場合の処理
System.out.println("Value is null");
}
Optional
を使用することで、null
チェックをより明示的に行うことができます。
これらの方法を適切に使い分けることで、NullPointerException
を効果的に回避できます。

安全な比較方法
Integer
オブジェクトのnull
を安全に比較するためには、いくつかの方法があります。
前述の通り、直接==
演算子を使用する方法もありますが、NullPointerException
のリスクを避けるためには、より安全な方法を選択するべきです。
最も推奨される方法は、Objects.equals()
メソッドを使用することです。
このメソッドは、null
チェックを内部で行ってくれるため、NullPointerException
が発生する心配がありません。
Integer num1 = null;
Integer num2 = 10;
if (Objects.equals(num1, num2)) {
// num1とnum2が等しい場合の処理
} else {
// num1とnum2が等しくない場合の処理
}
Objects.equals()
メソッドは、引数が両方ともnull
の場合はtrue
を、片方がnull
の場合はfalse
を返します。
また、Integer
オブジェクトの値を比較する場合は、equals()
メソッドを使用する必要があります。
ただし、equals()
メソッドを直接呼び出す場合は、null
チェックを事前に行う必要があります。
Integer num1 = null;
Integer num2 = 10;
if (num1 != null && num1.equals(num2)) {
// num1とnum2が等しい場合の処理
} else {
// num1とnum2が等しくない場合の処理
}
この方法では、num1
がnull
でないことを確認してからequals()
メソッドを呼び出しています。
もしnum1
がnull
の場合、equals()
メソッドは呼び出されず、NullPointerException
は発生しません。
Optional
クラスを使用する方法もあります。
Optional
を使用すると、null
の可能性のある値を明示的に扱うことができます。
Optional<Integer> optionalNum1 = Optional.ofNullable(num1);
Optional<Integer> optionalNum2 = Optional.ofNullable(num2);
if (optionalNum1.equals(optionalNum2)) {
// optionalNum1とoptionalNum2が等しい場合の処理
} else {
// optionalNum1とoptionalNum2が等しくない場合の処理
}
これらの方法を適切に使い分けることで、NullPointerException
を回避し、安全にInteger
オブジェクトを比較することができます。
0 変換の検討
Integer
オブジェクトがnull
の場合に、それを0
に変換することを検討する場面は少なくありません。
データベースから取得した数値データや、外部APIから取得したデータなど、さまざまなケースでnull
値が発生する可能性があります。
null
を0
に変換することで、NullPointerException
を回避し、計算処理などをスムーズに行うことができます。
null
を0
に変換する方法はいくつかあります。
最も簡単な方法は、三項演算子を使用することです。
Integer num = null;
int value = (num == null) ? 0 : num;
このコードでは、num
がnull
の場合、value
に0
が代入されます。
num
がnull
でない場合は、num
の値がvalue
に代入されます。
Java 8以降では、Optional
クラスを使用して、より簡潔にnull
を0
に変換することができます。
Integer num = null;
int value = Optional.ofNullable(num).orElse(0);
Optional.ofNullable(num)
は、num
がnull
でない場合はnum
をラップしたOptional
オブジェクトを返し、num
がnull
の場合は空のOptional
オブジェクトを返します。
orElse(0)
は、Optional
オブジェクトが空の場合に0
を返します。
また、Integer
オブジェクトの値をint
型に変換する際に、null
を0
に変換することも可能です。
Integer num = null;
int value = (num != null) ? num.intValue() : 0;
このコードでは、num
がnull
でないことを確認してからintValue()
メソッドを呼び出しています。
num
がnull
の場合は、0
が返されます。
ただし、null
を0
に変換することが常に正しいとは限りません。
null
が特別な意味を持つ場合や、0
が有効な値である場合は、null
を0
に変換することで、意図しない結果が生じる可能性があります。
したがって、null
を0
に変換する際には、その意味を十分に理解した上で、慎重に判断する必要があります。

Java Integer 比較 : Null 時の注意点と対策
- 数値を比較する際の落とし穴
- 許容は可能か?
- int型 null 代入時の挙動
- String型とnullと""の違いは?
- 大小比較はどう行う?
数値を比較する際の落とし穴
Javaでnull
の可能性のある数値を比較する際には、いくつかの落とし穴が存在します。
特に、Integer
のようなラッパークラスを使用する場合、プリミティブ型であるint
とは異なる挙動を示すため、注意が必要です。
最も一般的な落とし穴は、NullPointerException
の発生です。
例えば、Integer
オブジェクトがnull
である状態で、そのオブジェクトに対してintValue()
メソッドを呼び出したり、プリミティブ型のint
に代入しようとすると、NullPointerException
が発生します。
Integer num = null;
int value = num.intValue(); // NullPointerExceptionが発生
また、Integer
オブジェクトを比較演算子(==
、>
、<
など)で比較する場合にも注意が必要です。
==
演算子は、オブジェクトの参照を比較するため、値が同じでも異なるオブジェクトであればfalse
を返します。
さらに、null
を含むInteger
オブジェクトを比較演算子で比較すると、NullPointerException
が発生する可能性があります。
Integer num1 = null;
Integer num2 = 10;
if (num1 > num2) { // NullPointerExceptionが発生する可能性
// 処理
}
これらの落とし穴を回避するためには、以下の点に注意する必要があります。
- Integerオブジェクトがnullでないことを確認してから、intValue()メソッドを呼び出す。
- Integerオブジェクトの値を比較する場合は、equals()メソッドを使用する。
- 比較演算子を使用する場合は、nullチェックを事前に行う。
- Java 7以降では、Objects.equals()メソッドを使用することで、nullチェックを省略できる。
これらの対策を講じることで、NullPointerException
を回避し、安全にnull
の可能性のある数値を比較することができます。

許容は可能か?
結論から言うと、Javaのプリミティブ型であるint
は、null
を許容しません。
int
は数値を直接格納する型であり、オブジェクトではないため、参照を持たない状態、つまりnull
を表現することができません。
int
型の変数にnull
を代入しようとすると、コンパイルエラーが発生します。
int num = null; // コンパイルエラー
しかし、int
型の代わりにInteger
を使用することで、null
を許容することができます。
Integer
はラッパークラスであり、int
型の値をオブジェクトとして扱います。
そのため、Integer
オブジェクトにはnull
を代入することができます。
Integer num = null; // OK
ただし、Integer
オブジェクトがnull
である状態で、そのオブジェクトに対してメソッドを呼び出したり、プリミティブ型のint
に代入しようとすると、NullPointerException
が発生します。
もし、どうしてもint
型でnull
のような状態を表現したい場合は、特別な値を定義して、それをnull
の代わりに使うという方法があります。
例えば、-1
をnull
の代わりに使用するなどが考えられます。
しかし、この方法はコードの可読性を低下させる可能性があるため、慎重に検討する必要があります。
int型 null 代入時の挙動
int
型にnull
を代入しようとした場合、コンパイルエラーが発生します。
これは、int
がプリミティブ型であり、オブジェクトではないため、参照を持たない状態、つまりnull
を表現することができないためです。
int num = null; // コンパイルエラー
このコードはコンパイル時にエラーとなり、実行することはできません。
コンパイルエラーを回避するためには、int
型の代わりにInteger
を使用する必要があります。
Integer
はラッパークラスであり、int
型の値をオブジェクトとして扱います。
そのため、Integer
オブジェクトにはnull
を代入することができます。
Integer num = null; // OK
ただし、Integer
オブジェクトがnull
である状態で、そのオブジェクトに対してメソッドを呼び出したり、プリミティブ型のint
に代入しようとすると、NullPointerException
が発生します。
Integer num = null;
int value = num.intValue(); // NullPointerExceptionが発生

String型とnullと""の違いは?
JavaのString
型において、null
と""
(空文字列)は、それぞれ異なる意味を持ちます。
null
は、オブジェクトがどこも参照していない状態を表します。
つまり、String
オブジェクトがメモリ上に存在しない状態です。
一方、""
は空文字列を表します。
String
オブジェクトはメモリ上に存在しますが、その内容は空であるという状態です。
これらの違いを表にまとめました。
項目 | null | ""(空文字列) |
---|---|---|
オブジェクト | 存在しない | 存在する |
メモリ | 割り当てなし | 割り当てあり |
長さ | 存在しないため、取得不可 | 0 |
メソッド | 呼び出し不可(NullPointerException) | 呼び出し可能 |
null
のString
オブジェクトに対してメソッドを呼び出そうとすると、NullPointerException
が発生します。
一方、""
のString
オブジェクトに対しては、メソッドを呼び出すことができます。
String str1 = null;
String str2 = "";
System.out.println(str2.length()); // 0
//System.out.println(str1.length()); // NullPointerExceptionが発生
null
と""
は、それぞれ異なる状況で使用されます。
null
は、値が未定義であることを示すために使用されることがあります。
例えば、データベースから取得したデータが存在しない場合に、null
が返されることがあります。
一方、""
は、値が空であることを示すために使用されます。
例えば、ユーザーが何も入力しなかった場合に、フォームの入力欄に""
が設定されることがあります。
null
と""
のどちらを使用するかは、その状況によって異なります。
大小比較はどう行う?
Javaでnull
を含む数値を大小比較する場合、直接比較演算子(>
、<
、>=
、<=
)を使用することはできません。
これは、null
が数値ではないため、大小関係を定義できないためです。
null
を含む数値を大小比較するためには、以下のいずれかの方法を使用する必要があります。
- nullチェックを事前に行う。
- Objects.compare()メソッドを使用する。
- Optionalクラスを使用する。
null
チェックを事前に行う場合は、以下のように記述します。
Integer num1 = null;
Integer num2 = 10;
if (num1 == null) {
// num1がnullの場合の処理
} else if (num2 == null) {
// num2がnullの場合の処理
} else if (num1 > num2) {
// num1がnum2より大きい場合の処理
} else {
// num1がnum2以下の場合の処理
}
この方法では、null
の場合の処理を別途記述する必要があります。
Objects.compare()
メソッドを使用する場合は、以下のように記述します。
Integer num1 = null;
Integer num2 = 10;
int result = Objects.compare(num1, num2, Comparator.nullsFirst(Comparator.naturalOrder()));
if (result > 0) {
// num1がnum2より大きい場合の処理
} else if (result < 0) {
// num1がnum2より小さい場合の処理
} else {
// num1とnum2が等しい場合の処理
}
Objects.compare()
メソッドは、引数がnull
の場合でもNullPointerException
を発生させません。
Comparator.nullsFirst(Comparator.naturalOrder())
は、null
を最小値として扱うためのComparator
です。
Optional
クラスを使用する場合は、以下のように記述します。
Integer num1 = null;
Integer num2 = 10;
Optional<Integer> optionalNum1 = Optional.ofNullable(num1);
Optional<Integer> optionalNum2 = Optional.ofNullable(num2);
if (optionalNum1.isPresent() && optionalNum2.isPresent()) {
if (optionalNum1.get() > optionalNum2.get()) {
// num1がnum2より大きい場合の処理
} else if (optionalNum1.get() < optionalNum2.get()) {
// num1がnum2より小さい場合の処理
} else {
// num1とnum2が等しい場合の処理
}
} else if (optionalNum1.isPresent()) {
// num1が存在し、num2が存在しない場合の処理
} else if (optionalNum2.isPresent()) {
// num2が存在し、num1が存在しない場合の処理
} else {
// num1とnum2が存在しない場合の処理
}
Optional
クラスを使用することで、null
の可能性のある値を明示的に扱うことができます。
これらの方法を適切に使い分けることで、NullPointerException
を回避し、安全にnull
を含む数値を大小比較することができます。

java integer 比較 null 問題の要点まとめ
次のように記事の内容をまとめました。
- intとIntegerは明確な違いがあり、適切な使い分けが重要だ
- intはプリミティブ型で数値を直接格納し、Integerはラッパークラスでint型の値をオブジェクトとして扱う
- Integerはnull値を扱えるが、intは扱えない
- Integerはintよりもメモリ消費量が大きく、処理速度も若干遅くなる
- null値を含むIntegerをintにアンボクシングすると、NullPointerExceptionが発生する可能性がある
- Integerにはnullを代入できるが、nullのIntegerオブジェクトに対してメソッドを呼び出すとNullPointerExceptionが発生する
- Integerオブジェクトがnullかどうかをチェックする方法はいくつかある
- 最も基本的な方法は==演算子を使用することだ
- Java 7以降では、Objects.equals()メソッドを使用することもできる
- Optionalクラスを使用することも可能だ
- Integerオブジェクトのnullを安全に比較するためには、Objects.equals()メソッドを使用することが推奨される
- Integerオブジェクトがnullの場合に、それを0に変換することを検討する場面は少なくない
- nullを0に変換する方法はいくつかある
- 最も簡単な方法は、三項演算子を使用することだ
- Java 8以降では、Optionalクラスを使用して、より簡潔にnullを0に変換することができる