プログラミング Java

【Java】Stringのequalsで定数を左側にする理由

投稿日:

JavaのStringでequalsによる等価判定を行う場合に、
比較対象となる定数は左側にする理由はNullPointerExceptionを回避するためです。
以降、NullPointerExceptionが発生する仕組みと、
定数を左側にすることでどのように回避できるのかについて解説していきます。
 

Stringクラスのequalsメソッド

Stringクラスに定義されているequalsメソッドです。
この中身も含めて解説していきます。

 

定数を右に置いた場合

<実行結果>

Exception in thread "main" java.lang.NullPointerException
at string_test.EqualsTest.main(EqualsTest.java:13)

<解説>

「Stringクラスのequalsメソッド」を見て下さい。
7行目:int n = value.length;
ここが、NullpointerExceptionの発生箇所です。

比較元のStringオブジェクト(str)のフィールドであるvalueがNullなので、
ここでNullPointerExceptionになります。

 

定数を左に置いた場合

<実行結果>

null
str is not String

<解説>

比較対象の文字列(Null値)を左にすると、「Stringクラスのequalsメソッド」の
5行目:if (anObject instanceof String) { でFalse判定となります。
7行目は実行されませんので、20行目でreturn false; となり、正常に機能します。

※5行目がFalseになるのは、
 String型同士の比較であっても値がNullの場合はFalseになるためです。((A)参照)。

 

どうしても左側にNullが入る可能性を排除できない場合

比較する値が左右ともに変数で、左側にNullが入る可能性を排除できないような場合は、
try~catchなどの対処が必要です。

<実行結果>

左側の変数がNullのため、評価できません。
java.lang.NullPointerException
at string_test.EqualsTest.main(EqualsTest.java:11)

<解説>

Null同士だからTrueが返ってくるわけではありません。
左側の値がNullなので、NullPointerExceptionが発生するため、
try~catchで例外を補足します。

他にも、Nullだったら強制的に空値(“”)で初期化するという方法も使えると思います。
大事なことは、左側にNullが入り込む余地があるなら必ず何らかの対処をするということです。

 

まとめ

・比較する変数を左|定数を右に置くと、NullPointerExceptionが発生する原因になる。
・定数を左|比較する変数を右に置くと、False判定として機能する。
・左側にNullが入る可能性がある場合、try~catchなどで対処する。

 
最後までお読み頂き、ありがとうございました!
ご意見・ご要望がありましたら、遠慮なくコメント下さい!
もし内容が良かったらランキング評価を頂けると励みになります(^^)

ランキング評価する

-プログラミング, Java
-,

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


関連記事

junit, テスト, junit5

【JUnit5】基本的なAssertionまとめ

概要 JUnit5における基本的なAssertionをまとめました。 検証方法 等価性 値が等価であるかを検証するメソッドです。 以下はorg.junit.jupiter.api.Assertions …

idea, intellij, jet, brain, jetbrain

【IntelliJ Idea】Spring Boot DevToolsの自動ビルドを有効にする設定

IntelliJ Ideaの場合、自動ビルドの設定を有効にする必要があります。 前提 Gradle、またはMavenプロジェクトで作成しているはずなので、 dependenciesにSpring Bo …

【Java】オブジェクト指向の練習題材(成績オブジェクト)

前回記事、オブジェクト指向とは何なのかを簡単に説明してみるの練習題材です。 ここでは2つのオブジェクトを作成していきます。 成績オブジェクト:教科と点数などを保持 生徒オブジェクト:氏名と成績を保持 …

Eclipseでタブを半角スペースに変換する便利プラグイン!

Eclipseでタブを半角スペースに変換する便利プラグインに、 AnyEdit Toolsというものがあります。 導入方法を以下に記載致しましたので参考にして下さい。   どういうものか? …

違い,diff,比較,天秤

【図解】Mockito – mock と spy の違いは?

テストコードでモックを書くときによく使うMockitoですが、mock()とspy()の違いについてよくわからないという方向けに図解で解説します。 図解 mock() ・全てのメソッドが一旦使用不可に …

■運営者プロフィール
IT業界10年のエンジニア。
PHP -> VBA -> Javaと渡り歩いてきて、今はJavaをメインにフリーランスエンジニアとして活躍中!

[保有資格]
・Java SE 11 Gold

一度はエンジニアを辞めざるを得なかった私が再びエンジニアとして復活した数奇な物語

SpringFramworkの良書

■おすすめ教材
Javaの基本を学んだ人が、次のステップとして読む本(中級者向け)

※SpringはJavaのFrameworkの1つです。
変更のしやすさ、保守性の高さが特徴です。