【プログラム】【Java】Java のプログラムバグのパターン

[1] 数値 null をString.valueOfで文字列変換した場合、nullにならない

 * 数値 null をString.valueOfで文字列変換した場合、
   null にならずに、文字列で "null" になる

サンプル

public class SampleCode {
   public static void main(String[] args) {
      Integer value = null;
      String valueString = String.valueOf(value);
      if (valueString == null) {
         System.out.println("null");
      } else {
         System.out.println("not null : " + valueString);
      }
   }
}

出力結果

not null : null

[2] ドット「.」を区切りにする場合、「.」だけでは、分割できない

 * 以下の「サンプル : 修正前」を実行してみると、
   ドット「.」を区切りで分割されず、「Done」とだけ表示される

サンプル : 修正前

* 実行してみると「Done」とだけ表示される
public class Main {
   public static void main(String[] args) {
      String ipv4 = new String("127.0.0.1");
      // ★この部分に問題あり★
      String[] results = ipv4.split(".");
      for (String result : results) {
         System.out.println("Result : " + result);
      }
      System.out.println("Done");
   }
}

サンプル : 修正後

      // ★この部分を修正「split(".");」⇒「split("\\.");」★
      String[] results = ipv4.split("\\.");

出力結果

Result : 127
Result : 0
Result : 0
Result : 1
Done

[3] 正規表現で意図したとおり動かない

 * 以下のように正規表現「[E001]\nFailed because the value (.*) is invalid.」を使って
   検索しても、意図したとおり動かない。
   => 正規表現の文字をエスケープする必要がある

サンプル : 修正前

* 出力結果は「not match」
public class Main {
   public static void main(String[] args) {
      String target = "[E001]\nFailed because the value (aaa) is invalid.";
      String regularExpression = "[E001]\nFailed because the value (.*) is invalid.";
      if (target.matches(regularExpression)) {
         System.out.println("match");
      } else {
         System.out.println("not match");
      }
   }
}

サンプル : 修正後

* 出力結果は「match」
      // ★この部分を修正「[E001]」⇒「\\[E001\\]」★
      String regularExpression = "\\[E001\\]\nFailed because the value (.*) is invalid.";

関連記事

* 正規表現
http://blogs.yahoo.co.jp/dk521123/33605882.html

関連記事

プログラムバグのパターン

http://blogs.yahoo.co.jp/dk521123/22609164.html

Javaの文字列の扱い

* [2] に関連
http://blogs.yahoo.co.jp/dk521123/13687446.html