はじめに

さすらいのパンピープログラマです。
Javaで配列を使っていじいじしてたらハマったこと(未解決)
アドバイスあればぜひお願いします。

発生している問題

実際にコードをみてもらったほうが早いですよね…

qiita.java
//おまじない省略
char[] charArray = new char[50];
String str = "hogefugafoobar";

charArray = src.substring(0,14).toCharArray();

for(char data:charArray){
System.out.printf("%2c",data);
}
System.out.print("\n");

charArray[14] = '!';


charArrayを50とって0~13まで文字が入っているはずなので
'!'が後に入ると思いきや...

c:\Users\Java > java qiita
h o g e f u g a f o o b a r
Exceptionなんたらかんたら ~ java.lang.ArrayIndexOutOfBoundsException:14 ~ なんたらかんたら

お馴染みのArrayIndexOutOfBoundsExceptionが発生
外を参照しようとしているからだろ!と言われればそうなのですが、では new char[50] をした意味とはいったいなんなのでしょう...

なにがしたいのか

作ってるものとしては以下の要件です。
便宜上、文字列という単語を出しますがその正体はただの文字型です。

  1. もともと入っている文字列の一部分を抜き出す。
  2. 抜き出した文字列をある法則に基づいて別の文字列に変換する。
  3. それをもともと入っていた場所に代入。
  4. 代入する際に元々の文字列と変換後の文字列の長さを比較。
  5. 比較の結果、長さが増減した場合、その分だけ配列の中身を移動させる。
  6. その後、代入し処理を終了するなり繰り返すなりする。

細かい仕様は抜いてますが、大まかな流れは以上です。
問題が起きているのは 5 の部分です。

変換後の文字列の長さがもともとの文字列の長さより増えた場合、抜き出した部分より後ろにある要素を配列の後ろに増えた分だけ移動させなければならなくなります。

その際に「最後の要素+1 = 最後の要素」で移動させることになるのですが、そこでかの例外が発生しています。

聞きたいこと

Javaだけでなんとか解決できる策を探しています。
どこを探しても有用な情報が見つからず(外を見てるからの一点張り)この記事を投稿するに至りました。

そこで
- 解決できるかどうか
- 他にやり方があるかどうか
という点に絞ってアドバイスをいただきたいと考えています。
もちろん、自由にコメントくださっても結構です。

ぜひ、よろしくお願いいたします。
以上です。

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.