substring を利用して文字列の抜き出しを行っているのですが、
test = "0123456789";
substring( test ,11,12);
以上の処理を行うと当然エラーがでますが、文字がない場合に test に A という文字を入れたい場合はどうしたらいいでしょうか?
よろしくお願いいたします。
例文は、
test.substring(11,12);
の間違いですよね?
文字が無い場合というのが何をあらわしているのかがよく分からないのですが、
test = "A";
ということでしょうか?
if (test.length >9) {
test ="A";
}else{
test.substring(11,12);
}
こんな感じになりますね。
ありがとうございます。
文字数を調べてやる方法も試してみます。javaは、このあたりは厳しそうですね、、、。
ええっと、こういうことでしょうか?
public class Test {
public static void main(String argv[]){
String test = "0123456789";
try{
System.out.println(test.substring(11,12));
}
catch(java.lang.StringIndexOutOfBoundsException e){
test = "A";
}
System.out.println(test);
}
}
Stringオブジェクトのsubstringで開始・終了インデックスの範囲外だった場合はIndexOutOfBoundsExceptionが発生されるので、それをひろって好きな処理をすればいいのでは?
ありがとうございます!
やはり、try catch が最適みたいですね。
助かりました。早速試してみます。
Exception を拾うのが確実ではありますが、Java は Exception の発生がコストが高いこととあくまで「例外」であることから、
if による分岐が適当と思います。
基本は2番の方と同じなのですが、条件判定が違っているようなので。
あと、substring 関数は元のString を変更しません。
if (test.length >= 11) { test = test.substring(11,12); }else{ test = "A"; }
ありがとうございます、これは安全そうですね!
文字数を数える方がやはり安全っぽいですね、、、。
try-catchは最適ではありません。
http://www.nextindex.net/java/perform/tips.html
(ロジック分岐のための例外処理 参照)
やはり文字数を事前に調べる必要があるのではないでしょうか?
三項演算子を用いれば多少すっきりさせることが可能です。
String test = "0123456789"; int beginIndex = 11; int endIndex = 12; test = test.length() >= endIndex ? test.substring(beginIndex,endIndex) : "A";
ありがとうございます。これはすっきりしていて、すぐに使えそうです!
助かります!
ちなみにsubstringの開始位置は相対位置(先頭が0)になるので、
substring(11,12)と書くと12文字目を切り出そうとします。
try catchはオーバーヘッドが大きいのでむやみに使うべきでない、と本で読んだことがあります。
よって最初の方の回答、lengthチェックをするのが良いのではないでしょうか。
sta_posを切り出し位置の絶対指定(先頭なら1)とすると、
if (test.length < sta_pos)
{
test ="A";
}
else
{
test.substring(sta_pos - 1, sta_pos);
}
でどうでしょう。
ありがとうございます!
try catch はなるべく使用しないようにして、やってみたいと思います。
エラーを利用する、という事みたいなので、やはりさけた方が無難なんですね。
#3です。
すみません。例外扱いしたいのだと思い込んでいました。
substringを決まった桁でかけている以上、対象文字列は日付等の固定長のデータで、
その一部を切り出したい、といった用途を想定しました。
異常値が入ってきた場合、その識別のために"A"を入れようとしているのかと思ったので、try-catchを書きました。
(ですので、catchで"A"を入れるというよりは、識別できたあとの処理を想定。)
ようは、何を意図して、何を想定して作るかだと思うのですが、あたりまえに11,12桁目がないデータが入ってくるのでしたら、私も横着をしないで条件分岐をすることをオススメします。
そうでなく、11,12桁目がないのは想定外のデータで、異常状態として扱いたいのなら、コストがかかってもExceptionを拾った分かりやすいのではないかと思います。
この判断は、そのまんま、条件分岐をしたいのか、異常処理をしたいのか、に尽きますね。
ご解答ありがとうございました!
条件分岐を利用する事にしました、もちろん念のためにtryも利用します(^^)
恐らく文字数不明、指定桁数不明の状態でとの意味だと思いましたので以下のようになるかと思います。
String test = "0123456789"; // 対象文字列 int target = 11; // 抽出対象桁(1以降指定) if (test.length() < target) { test = "A"; } else { test = test.substring(target - 1, target); }
いくつかご提案なさっているコードではコンパイルが通らなかったり、桁数によって例外が発生したりかと思いますので、念の為投稿させて頂きました。
ありがとうございます!
短いソースで実際に利用できそうです!
ありがとうございます!!
ああ!すいません、間違えました!
その通りです。test.substring(11,12);
の間違いです。
文字がないというのは、例えば文字列の切り出しを行った場合に、指定した場所に文字がなかった場合(testに入っているのは10文字だけなので)、なにか別の文字をtestに入れる事ができたらいいな、と思ったので質問してみました。