2009-10-15 8 views
2

Ce programme, je fais un cours COSC ne compilait droit, je continue à obtenir l'erreur:L'index de chaîne hors limites? (Java, boucle de sous-chaîne)

Exception dans le thread « principal » java.lang.StringIndexOutOfBoundsException: index de chaîne de gamme: 2

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

Voici mon code:

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

Pour mon savoir bord cela devrait fonctionner, mais pourquoi pas? Toute aide est la bienvenue. Je vous remercie!

Répondre

5

Vous devrez peut-être prendre les = dans la ligne

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

et le rendre

while (count < input.length()) { 

parce qu'il est à l'origine du sous-chaîne à lire au-delà de la longueur de la chaîne.

=============== Mais je vais ajouter quelques bits supplémentaires de conseils, même si ce ne est pas demandé pour:

ne pas utiliser == pour comparer des chaînes , utilisez

letter.equals("a") 

à la place. Ou mieux encore, essayez d'utiliser

char c = input.charAt(count); 

pour obtenir le caractère actuel, puis comparer comme ceci:

c == 'a' 
0

Retrait du signe égal doit corriger cela.

while (count < input.length()) {

et puisque vous voulez obtenir un seul caractère, vous devriez faire ceci:

substr(count,1)

parce que le 2ème paramètre est la longueur en fait, ne pas indexer.

+0

D'accord, il compile! Mais ne produit toujours pas les bonnes quantités. La chaîne de test "aeiou" donne 0, 0, 0, 0, 0 .. – Brad

+0

changer pour 'substr (count, 1)' – mauris

+0

Ne pas utiliser == pour comparer les chaînes comme mentionné dans les autres réponses –

0

Je pense que votre condition de boucle doit être count < input.length. À l'heure actuelle, la dernière itération s'exécute avec count == length, de sorte que votre appel substring reçoit un index de début après le dernier caractère de la chaîne, ce qui est illégal. Ces types d'erreurs de limite sont très courants lors de l'écriture de telles boucles, il est donc toujours bon de vérifier deux fois et trois fois les conditions de votre boucle lorsque vous rencontrez un bug comme celui-ci. De plus, la comparaison de chaînes avec l'opérateur == ne fera généralement pas ce que vous voulez. Cela compare si oui ou non les deux variables référencent le même objet. Au lieu de cela, vous voulez tester string1.equals(string2), qui compare le contenu des deux chaînes.

0

Correction avec l'aide de tout le monde, et surtout de Vincent. Je vous remercie! Fonctionne à merveille.

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

vous pouvez utiliser une boucle for pour ranger encore plus loin: - for (int count = 0; count pstanton

+0

Ceci ne fournit pas de réponse à la question. Pour critiquer ou demander des éclaircissements à un auteur, laissez un commentaire en dessous de son message - vous pouvez toujours commenter vos propres messages, et une fois que vous aurez suffisamment de [réputation] (http://stackoverflow.com/help/whats-reputation) vous pourrez être capable de [commenter sur n'importe quel post] (http://stackoverflow.com/help/privileges/comment). – WilQu

+0

@WilQu avez-vous lu cette question? c'est l'OP qui affiche la solution de travail. comment cela devrait-il être un commentaire? – meda

0

Avant boucle, essayez ci-dessous

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