2017-02-12 7 views
-1

私は同じようなスレッドをいくつか読んだことがありますが、私のコードに答えを適用する方法はわかりません。申し訳ありません...java.lang.StringIndexOutOfBoundsException:文字列インデックスが範囲外です:(再)

I以下のコードを実行し、エラーを取得しています: java.lang.StringIndexOutOfBoundsException:範囲外の文字列インデックス:

プログラムの成果は大丈夫です。私はスキャナで入力した文字列からすべての大文字を得ています。しかし、エラーメッセージはちょっとしたことです。

ご協力いただきありがとうございます。前もって感謝します!

import java.util.Scanner; 

public class TestClass { 

    public static void main(String[] args) { 

     Scanner in3 = new Scanner(System.in); 
     System.out.print("Enter a senctence with capitals: "); 
     String inputString = in3.nextLine(); 

     int stringLength = String.valueOf(inputString).length(); 
     int i = 0; 

     while (i <= stringLength) 
     { 
      int subsStart = i; 
      int subsEind = i + 1; 

      String stringToCheck = inputString.substring(subsStart, subsEind); 

      char letterToCheck = stringToCheck.charAt(0); 

      if (Character.isUpperCase(letterToCheck)) 
      { 
       System.out.println(letterToCheck); 
      } 
      i++; 

     } 
     in3.close(); 

    } 

} 
+0

i == stringLengthの場合はどうなりますか?部分文字列はどのように機能しますか? –

+0

'i == stringLength - 1'ならどうなりますか? – Guy

+0

そして、なぜあなたは 'String.valueOf'に何か文字列である必要がありますか? –

答えて

0

文字列の最後からインデックスを作成する場所がいくつかあります。まず、文字列の長さが文字列への不正なインデックスであるため、メインループはstringLengthを通過しません。せいぜい、ループは、ループが

while (i < stringLength) // NOT i <= stringLength 

を記述する必要があります。しかし、別の問題があることを意味する、stringLength - 1を通過する必要があります。ループ内では、

String stringToCheck = inputString.substring(subsStart, subsEind); 

を計算し、後でstringToCheckが空の文字列ではないことを前提になる

char letterToCheck = stringToCheck.charAt(0); 

を評価しています。残念ながら、subsStart == stringLengthの場合、その仮定は失敗します。したがって、あなたがstringLength前に、あなたの外側のループを停止する必要があります。

while (i < stringLength - 1) 

をしかし、あなたは一度に1つの文字でのみ興味があるため、私は、サブストリングを抽出して気にしないでしょう。また、コードには冗長な変数がたくさんあります。私はこれのようなものを書くでしょう:

public static void main(String[] args) { 

    Scanner in3 = new Scanner(System.in); 
    System.out.print("Enter a sentence with capitals: "); 
    String inputString = in3.nextLine(); 

    int stringLength = inputString.length(); 

    for (int i = 0; i < stringLength; i++) 
    { 
     char letterToCheck = inputString.charAt(i); 

     if (Character.isUpperCase(letterToCheck)) 
     { 
      System.out.println(letterToCheck); 
     } 

    } 
    // in3.close(); // not really needed for System.in 
} 
0
while (i <= stringLength) 

eaxampleについて

while (i < stringLength) 

なければならない、hello 5の文字列の長さを有するが、索引付けの点で、それは..のみ4までである0 1 2 3 4

+2

実際には、while(i

0

最後の2回の反復は失敗します。

String stringToCheck = inputString.substring(subsStart, subsEind); 

はインデックス& stringLength+1 stringLengthを読み取ろうとするだけ stringLength-1があります。

関連する問題