【PL/I学習|初心者向け】PL/IからJavaへ:文字列比較における「空文字」と「空白」の落とし穴

1. 導入:なぜこの違いが重要なのか

メインフレームでの開発経験が長い技術者にとって、PL/Iの文字列比較は「直感的で便利」なものとして馴染み深いでしょう。しかし、現代のオープン系言語(Javaなど)へ移行する際、この「空白充填のルール」が重大なバグの原因となることが非常に多いのです。本記事では、システム移行や比較検討の際に必ず直面する「空文字」と「空白」の決定的な違いについて解説します。

2. 基礎知識:PL/Iと現代言語の比較ルール

PL/Iにおいて、比較演算子(=)を使用すると、比較対象の両辺の長さが短い方に合わせて空白(スペース)で自動的に右側が埋められます(空白充填)。つまり、長さが異なる文字列同士を比較しても、システムがよしなに調整してくれます。

一方、Javaをはじめとする多くの言語では、文字列の「長さ」や「内容」を厳密に区別します。特に「空文字(長さ0の文字列)」と「空白(スペース文字を含む文字列)」は、プログラム上では「全くの別物」として扱われます。この違いを理解していないと、入力データが「空白」の場合に、ロジックが期待通りに動作しないという不具合が発生します。

3. 実装と解決策:安全な比較のために

PL/IからJavaへの移行時に推奨される解決策は、比較の前にtrim()メソッドを用いて余分な空白を除去する(正規化する)ことです。これにより、PL/Iに近い「意味的な値の有無」を判定できるようになります。

4. サンプルプログラム:Javaでの安全な文字列比較例

以下のコードは、入力データが「空(空文字または空白のみ)」であるかを判定する実用的な例です。

/ Javaにおける安全な文字列判定のサンプル /
public class StringCheck {
public static void main(String[] args) {
// テストデータ:空白が含まれている
String data = ” “;

// trim()を使わない場合、” ” は “” と等しくないため false になる
if (data.equals(“”)) {
System.out.println(“成功”);
} else {
System.out.println(“失敗:空白が含まれているため空文字と判定されません”);
}

// trim()を使ってから判定することで、PL/Iの挙動に近づける
// isEmpty()は長さが0かどうかを判定するメソッド
if (data.trim().isEmpty()) {
System.out.println(“成功:空白を除去した結果、空文字として正しく判定されました”);
}
}
}

5. 応用・注意点:現場で陥りやすい罠

現場で最も注意すべきは、「NULL値」と「空文字」の混同です。PL/IではNULLに近い概念として空白を使用することが多いですが、Javaでは `null` の状態で `trim()` を呼び出すと `NullPointerException` が発生します。

移行時には、以下の「ガード条件」を追加するのが定石です。

・文字列が `null` でないことを確認する
・`trim()` を使って空白を除去してから判定する
・あるいは、Apache Commons Langなどのライブラリにある `StringUtils.isBlank()` を利用して、NULLチェックと空白判定を一度に行う

メインフレームからオープン系へ移行する際は、この「データ型の厳密さ」の違いを常に意識し、入力値の正規化を徹底するように心がけてください。

コメント

タイトルとURLをコピーしました