人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

JAVA初心者です。substringについて教えて下さい。

ある文字列の1文字目から15文字目を取得したいのですが、

下のやりかただとエラーになります。

public class Substr {
public static void main(String[] args) {
String s = "Hello World"; // 文字列sを生成

s = s.substring(0 , 15); // 1文字目から15文字目を取得

// 表示
System.out.println("文字列sの値は " + s + " です。");
}
}

このクラスを実行後に出力されるエラー。
=====
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 15
=====

このエラーを回避するために、下のように15文字以上のときだけ、切り出すという風にしましたが、
変数がたくさんある場合、手間で仕方ありません。

下のようにしないで、15文字より少なくても、エラーにならない方法はないでしょうか?
よろしくお願いします。

public class Substr {
public static void main(String[] args) {
String s = "Hello World"; // 文字列sを生成

if (s.length() > 14){
s = s.substring(0 , 15); // 1文字目から15文字目を取得
}else{
}

// 表示
System.out.println("文字列sの値は " + s + " です。");
}
}

●質問者: kuri6
●カテゴリ:インターネット ウェブ制作
✍キーワード: Class Hello world INDEX Java Out
○ 状態 :終了
└ 回答数 : 7/7件

▽最新の回答へ

1 ● KUROX
●18ポイント

処理が遅くなるとは思います。

その1もその2も動くと思いますが、

動作確認とれていません。

その2は(String)とかつけないとコンパイルが通らないかも

しれません。

---------------------------------------------------

■その1

String s = "Hello World"; // 文字列sを生成

s = s + " "; //15文字分の空白をつける

s = s.substring(0 , 15);

s = s.trim();

■その2

S= ((s + " ").substring(0 , 15)).trim();

◎質問者からの返答

KUROXさん早速のご回答ありがとうございます。

そこで、再質問ですが、実務で使う場合に、

if (s.length() > 14){

}

のやり方は、一般的でしょうか?(例えば、最大文字数が違う変数が5,6個あったとして、同じようなif文を5,6個書くことはアリなんでしょうか…(プロとして)というのが知りたいです。


2 ● kn1967
●17ポイント

if (s.length() > 14){

}

のやり方は、一般的でしょうか?

少し前のやりとりですが、参考になるかと思います。

http://q.hatena.ne.jp/1157614003


同じようなif文を5,6個書くことはアリなんでしょうか…(プロとして)

開発の手間を考えて関数化する場合と

速度優先で個別に書く場合とがありますので

アリともナシとも言えます。

関数化しておいて、もしもチューニングが必要になったら

その際に個別に展開するという手もアリです。


3 ● KUROX
●17ポイント

コメント欄にかけないので、こちらで回答させていただきます。

>実務で使う場合に

ここが難しいところなんですけど(^^;

>同じようなif文を5,6個書くことはアリなんでしょうか

妥当な理由があればOKだと「私」は思います。

elseもわざわざ書かれていますが、コーディングルールで

そう決まっているからですよね(たぶん・・)。

----------------------------------------

私ならというのでかまわないなら、

関数か、文字列操作するクラスを作ります。

cutString関数をコールすることにして

同じ処理は書かないようにします。

sがNULLの時もあると思うので、関数側で何らかの

対処をしたほうがいいとは思います。

このままだと、NULLPointerExceptinになって、

しまいます。

public String cutString(String s,int len){

if (s.length() > len){

s = s.substring(0 , len);

}else{

//処理なし

}

return s;

}


4 ● mo81
●17ポイント

質問の答えになってないかも知れませんが、

質問者さんのやり方が素直で一般的だと思います。


ただし、変数が多いとき手間になる(似たような処理を何度もやる)なら、

数値を定数に、処理をメソッドにまとめてしまうのがスマートだと思います。


public class Substr {

// 後で変更しやすいよう、15という数値を定数として定義

public final static int SHORT_STRING_LENGTH = 15;


// 再利用しやすいよう、処理をメソッドにまとめる

public static String toShortString(String s) {

if (s.length() >= SHORT_STRING_LENGTH) {

return s.substring(0, SHORT_STRING_LENGTH);

} else {

return s;

}

}


public static void main(String[] args) {

String s1 = "Hello World1"; // 文字列s1を生成

String s2 = "Hello World2"; // 文字列s2を生成


// 定義したメソッドを使って処理

s1 = toShortString(s1);

s2 = toShortString(s2);


// 表示

System.out.println("文字列s1の値は " + s1 + " です。");

System.out.println("文字列s2の値は " + s2 + " です。");

}

}


5 ● xxxatsxxx
●17ポイント

実務とか一般的ということであれば別のクラスで実装するのが望ましいと思います。ざっくりですので、ほかに実装すべきメソッドはほかにもあります。


実行ファイル>>

package hatena;

import hatena.MyStr;

public class SubStr {

public static void main(String[] args) {

MyStr s = new MyStr("Hello World");

System.out.println(s.mySubstring(0, 15));

}

}


別ファイルMyStr.java>>

package hatena;

public class MyStr {

private String myStrValue;

public MyStr(String arg0){

setValue(arg0);

}

public String getValue() {

return myStrValue;

}

public void setValue(String value) {

myStrValue = value;

}

public String mySubstring(int startIdx ,int endIdx){

System.out.println("開始" + startIdx + "終了" + endIdx);

System.out.println("文字長" + myStrValue.length());

if(myStrValue.length() < endIdx){

return myStrValue.substring(startIdx,myStrValue.length());

}

return myStrValue.substring(startIdx,endIdx);

}

}

◎質問者からの返答

回答者のみなさま

丁寧なご回答ありがとうございます。

それぞれのやりかたを検討していきます。

またコメントします。


1-5件表示/7件
4.前の5件|次5件6.
関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ