3

COSC コース用に作成しているこのプログラムは正しくコンパイルされていません。エラーが発生し続けます。

スレッド「メイン」での例外 java.lang.StringIndexOutOfBoundsException: 文字列インデックスが範囲外です: 2

java.lang.String.substring(String.java:1765) で VowelCount.main(VowelCount.java:13) で

これが私のコードです:

import java.util.Scanner;

public class VowelCount {
 public static void main(String[] args) {
  int a = 0, e = 0, i = 0, o = 0, u = 0, count = 0;
  String input, letter;
  Scanner scan = new Scanner (System.in);

  System.out.println ("Please enter a string: ");
  input = scan.nextLine();

  while (count <= input.length() ) {
   letter = input.substring(count, (count + 1));

   if (letter == "a") {
    a++; }
   if (letter == "e") {
    e++; }
   if (letter == "i") {
    i++; }
   if (letter == "o") {
    o++; }
   if (letter == "u") {
    u++; }

   count++;

  }
  System.out.println ("There are " + a + " a's.");
  System.out.println ("There are " + e + " e's.");
  System.out.println ("There are " + i + " i's.");
  System.out.println ("There are " + o + " o's.");
  System.out.println ("There are " + u + " u's.");
 }
}

私の知る限り、これは機能するはずですが、なぜ機能しないのですか? どんな助けでも素晴らしいでしょう。ありがとうございました!

4

5 に答える 5

5

行の = を削除する必要がある場合があります

while (count <= input.length() ) {

そしてそれを作る

while (count < input.length() ) {

部分文字列が文字列の長さを超えて読み取られるためです。

=============== ただし、求められていない場合でも、いくつかのアドバイスを追加します。

== を使用して文字列を比較しないでください。

letter.equals("a")

代わりは。またはさらに良いことに、使用してみてください

char c = input.charAt(count);

現在の文字を取得するには、次のように比較します。

c == 'a'
于 2009-10-15T01:36:30.943 に答える
0

みんな、特に Vincent の助けを借りて修正しました。ありがとうございました!素晴らしく走ります。

import java.util.Scanner;

public class VowelCount {
    public static void main(String[] args) {
        int a = 0, e = 0, i = 0, o = 0, u = 0, count = 0;
        String input;
        char letter;

        Scanner scan = new Scanner (System.in);

        System.out.print ("Please enter a string: ");
        input = scan.nextLine();

        while (count < input.length() ) {
            letter = input.charAt (count);

            if (letter == 'a')
                a++; 
            if (letter == 'e') 
                e++; 
            if (letter == 'i') 
                i++; 
            if (letter == 'o') 
                o++; 
            if (letter == 'u') 
                u++; 

            count++;

        }
        System.out.println ("There are " + a + " a's.");
        System.out.println ("There are " + e + " e's.");
        System.out.println ("There are " + i + " i's.");
        System.out.println ("There are " + o + " o's.");
        System.out.println ("There are " + u + " u's.");
    }
}
于 2009-10-15T01:45:37.210 に答える
0

等号を削除すると、それが修正されます。

while (count < input.length()) {

単一の文字を取得したいので、これを行う必要があります。

substr(count,1)

2 番目のパラメーターは実際にはインデックスではなく長さであるためです。

于 2009-10-15T01:37:41.703 に答える
0

あなたのループ条件はcount < input.length. 現在、最後の反復は で実行されるcount == lengthため、substring呼び出しには文字列の最後の文字の後に開始インデックスが与えられますが、これは違法です。この種の境界エラーは、このようなループを記述するときに非常に一般的であるため、このようなバグに遭遇した場合は、ループ条件を 2 回および 3 回チェックすることをお勧めします。

また、文字列を演算子と比較しても、==通常は期待どおりの結果が得られません。これは、2 つの変数が同じオブジェクトを参照しているかどうかを比較します。代わりにstring1.equals(string2)、2 つの文字列の内容を比較する をテストします。

于 2009-10-15T01:38:13.240 に答える