【頻出】Javaで == と equals() の違いを説明できますか?
勉強ちゃん
いろいろ勉強
Java Web開発をする際に、NullPointerException
、 ArrayIndexOutOfBoundsException
という例外はよく発生します。
その原因と予防策をまとめます。
参照しているオブジェクトが null
です。
つまり、参照しているオブジェクトがまだ初期化されていない、または値が null
に設定されてしまっているケースです。
例えば(4行目でNullPointerExceptionが発生しました)
public class Test {
public static void main(String[] args) {
Student student = new Student( null);
System.out.println(student.getName().replace(" ", ""));//空白スペースを除いて、出力
}
}
class Student {
private String name ;
Student(String name){
this.name = name;
}
public String getName(){
return this.name;
}
}
オブジェクトを使用する前にif (object != null)
のような条件分岐でnullでない ことを確認します。
(4行目でnull判定処理を追加)
public class Test {
public static void main(String[] args) {
Student student = new Student( null);
if(student.getName() != null){
System.out.println(student.getName().replace(" ", ""));//空白スペースを除いて、出力
}
}
}
class Student {
private String name ;
Student(String name){
this.name = name;
}
public String getName(){
return this.name;
}
}
「ここではnullになるはずがない」という場所でも、代入前にnull判定を加え、もしnullなら明示的に例外をスローします。
(22~24行目を判定処理を入れて、nullの場合、例外をスローし、8~12行目に特定のエラーを処理します)
public class Test {
public static void main(String[] args) {
try{
Student student = new Student( null);
if(student.getName() != null){
System.out.println(student.getName().replace(" ", ""));//空白スペースを除いて、出力
}
}catch(Exception e){
//エラーの原因を特定するログを出力
if("名称がnullです".equals(e.getMessage()))
System.out.println("特定のエラーが発生しました");
}
}
}
class Student {
private String name ;
Student(String name){
this.name = name;
}
public String getName() throws Exception{
if( name == null){
throw new Exception("名称がnullです");
}
return this.name;
}
}
配列のインデックスが有効範囲外になったときに発生します。
たとえば、配列の要素数を4と想定してアクセスしたが、実際には3しかないです。
例えば(4行目でArrayIndexOutOfBoundsExceptionが発生しました)
public class Test {
public static void main(String[] args) {
String[] array = new String[]{"リンゴ","バナナ","みかん"};
System.out.println(array[3]);
}
}
配列を操作する前に length
を確認して、アクセスするインデックスが有効範囲内であることを確かめます。
(4行目でサイズの判定処理を追加)
public class Test {
public static void main(String[] args) {
String[] array = new String[]{"リンゴ","バナナ","みかん"};
if(array.length >= 4){
System.out.println(array[3]);
}
}
}
どれだけ注意しても、予想外のデータや状況で例外が発生することはあります。
そのため、最後の保険として try-catch
を使い、発生した例外を正確に捕捉しログに残すことが重要です。
try {
// 業務ロジック処理
} catch (NullPointerException e) {
log.error("NullPointerException発生: " + e.getMessage());
} catch (ArrayIndexOutOfBoundsException e) {
log.error("配列範囲外アクセス: " + e.getMessage());
} catch (Exception e) {
log.error("その他の例外: " + e.getMessage());
}
こうすることで、後から原因を調査しやすくなり、保守性も高まります。
お役に立てればうれしいです。