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に変換することができる