2009-10-15 6 views
2

Эта программа, которую я делаю для COSC конечно не компиляции правильно, я получаю ошибку:Строковый указатель за пределами границ? (Java, петля подстрока)

Исключение в потоке «основной» 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."); 
} 
} 

Для мои знания это должно сработать, но почему? Любая помощь будет большой. Спасибо!

ответ

5

Вы, возможно, потребуется вынимать = в строке

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

и сделать его

while (count < input.length()) { 

, потому что он вызывает подстроку читать дальше длины строки.

=============== Но я добавлю несколько дополнительных битов советов, даже если его не просили:

не использовать == для сравнения строк , использование

letter.equals("a") 

вместо этого. Или еще лучше, попробуйте использовать

char c = input.charAt(count); 

, чтобы получить текущий символ затем сравнить, как это:

c == 'a' 
0

Удаление знака равенства следует исправить.

while (count < input.length()) {

и так как вы хотите получить один символ, вы должны сделать это:

substr(count,1)

, потому что второй параметр является на самом деле длина, не показатель.

+0

Alright, он компилирует! Но все равно не выводит правильные суммы. Тестовая строка «aeiou» приводит к 0, 0, 0, 0, 0 .. – Brad

+0

изменить на 'substr (count, 1)' – mauris

+0

Не использовать == для сравнения строк, как упоминалось в других ответах –

0

Я думаю, что ваше состояние петли должно быть count < input.length. Прямо сейчас, последняя итерация выполняется с count == length, поэтому вашему звонку substring присваивается начальный индекс после последнего символа в строке, что является незаконным. Эти типы ошибок границ очень распространены при написании таких циклов, поэтому всегда полезно дважды и трижды проверять условия цикла, когда вы сталкиваетесь с такой ошибкой.

Кроме того, сравнение строк с оператором == обычно не будет делать то, что вы хотите. Это сравнивает, ссылаются ли две переменные на один и тот же объект. Вместо этого вы хотите протестировать string1.equals(string2), который сравнивает содержимое двух строк.

0

Исправлено с помощью всех, и особенно Винсента. Спасибо! Бегает чудесно.

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."); 
    } 
} 
+0

, вы можете использовать цикл for чтобы убрать его еще больше: - для (int count = 0; count pstanton

+0

Это не дает ответа на вопрос. Чтобы критиковать или запросить разъяснения у автора, оставьте комментарий ниже своего сообщения - вы всегда можете прокомментировать свои собственные сообщения, и как только у вас будет достаточно [репутации] (http://stackoverflow.com/help/whats-reputation), вы будете быть в состоянии [прокомментировать любое сообщение] (http://stackoverflow.com/help/privileges/comment). – WilQu

+0

@WilQu Вы прочитали этот вопрос? это OP-сообщение рабочего решения. как это должно быть комментарий? – meda

0

Перед цикла, попробуйте ниже

if(input.length()>0){ 
//you code 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^