Java以外の言語で書かれたプログラムをJavaに移植するとき、注意すべきことの1つが、多次元配列の取り扱いです。例えば、下記のC言語のプログラムがあるとします。
実行結果を見てのとおり、C言語では、2次元配列の領域確保と初期化を同時に行うことができ、このとき、初期値が指定されていない要素には自動的に初期値(この例では、int型なので0)が設定されます。
このプログラムをJavaに移植してみましょう。Javaにおいても、2次元配列の領域確保と初期化を同時に行うことができますが、配列の大きさを指定するとエラーになりますので、要素数のカウントはJavaに任せます。
しかし、実行すると例外が発生してしまいます。
この違いは、CとJavaの2次元配列に対する実装方法の差によって起こります。C言語などでは、2次元配列とは要素数×要素数で表せる配列ですが、Javaでは参照構造を用いた「配列の配列」になっています。つまり、Javaでは、配列というオブジェクトへの参照を配列にしたものということになり、厳密には2次元配列ではないのです。ですから、配列を行列として見た場合に、各行の長さ(要素数)が違っても構いませんが、最初の行の長さを全部の行の長さとして用いると、この例のように例外が発生してしまうわけです。
このプログラムの場合、省略時の初期値である「0」を明示的に与えるか、下記のように、大きさを指定した領域確保をしてすべての要素に初期値を与えてから用いるといいでしょう。
Copyright © ITmedia, Inc. All Rights Reserved.