2013-04-08 4 views
1

Я получаю IndexOutOfBoundsException на линии, которая вызывает мою пользовательскую функцию: motCars = remplaceTirets(motAlea, motCars, lettreDon);. Эта функция должна превратить один или несколько штрихов в письмо, если данное письмо равна буква в слове) и линия в реальной функции, где она говорит: tempo += tirets.charAt(j);Индекс Java Out of Bounds Exception

Результат: _ _ _ _ _ _ _ (сумма этих черточек зависит от слова выбранного программы, которая работает, а затем он просит дать письмо, но когда я даю письмо я получаю:

исключения в потоке «основной 'java.lang.String IndexOutOfBoundsException. Индекс строки за пределами диапазона: 1.

Это отчасти на французском, потому что я живу в Квебеке. Но я надеюсь, что это не имеет значения, потому что французские слова касаются только строк и слов, а не логики Java. Я новичок и переполнен всеми советами на всех форумах на Java. Любые конкретные рекомендации будут приветствоваться.

Заранее благодарим за то, что нашли время, чтобы посмотреть!

Анита

import java.util.Scanner; 

class Tp { 

public static void main(String[] args) throws Exception { 

Scanner clavier = new Scanner(System.in); 
String motAlea = "";         
String motCars = "";     
char lettreDon = Character.UNASSIGNED;    
String tempo = "";         
String invite = ""; 
String tirets = ""; 
int l = 0;         
int m = 0;        

final String ANNONCE = "J'ai choisi un mot a deviner\n"; 
final String INSTRUCT = "Entrez une lettre a la fois. L'indice d'essais: 15.\n"; 
final String INVITE = "\tEntrez une lettre: "; 
final String BRAVO = "BRAVO ! Le mot a deviner etait: "; 
final String DESOLE = "DESOLE...Vous avez perdu..."; 

String[] vingtMots = { "WATTHEUREMETRE", "HELIOGRAPH", "GRENOUILLERE",  "CONTRAROTATIF", 
         "CUISSARDE", "BRIGANTINE", "AVITAILLEUR", "ENTREDOUBLURE", 
         "GALLETAGE", "OEUILLERE", "CREMAILLERE", "HALTEROPHILIE", 
         "MARTINGALE", "EMPENNAGE", "ENCOCHAGE", "DECLENCHEUR", 
         "BIMETALLIQUE", "PIVOTEMENT", "DECLINAISON", "CROISILLON" 
         }; // tableau string   

int indexAlea = 0; 
indexAlea = (int)(Math.random() * 20) + 1; 

motAlea = vingtMots[indexAlea]; 

for (l = 0; l < motAlea.length(); l++) { 
    tempo += "_"; 
    motCars = tempo; 
} // for 

System.out.print(ANNONCE); 
System.out.print(INSTRUCT); 
l = 0; 

do { 
    if (motCars.equals(motAlea)) { 
    System.out.print(BRAVO + motAlea + ", " + "devine en " + m + 
    " tentatives"); 
    System.exit(0); 
    } // if 

    if (l == 15) { 
     System.out.print("\n" + DESOLE + "Le mot a devine etait: " + 
     motAlea + ". " + "Au revoir... "); 
     System.exit(0); 
    } // if 

    for (int i = 0; i < motAlea.length(); i++) { 
    System.out.print(motCars.charAt(i) + " "); 
    } // for 

    m = l + 1; 
    invite = "\t" + INVITE + m + "> :"; 

    lettreDon = lecture(invite); 

    motCars = remplaceTirets(motAlea, motCars, lettreDon); 

    l++;  

} // do 
    while (l < 16); { 
    System.out.print("\n" + DESOLE + "Le mot a devine etait: " + motAlea + ". " 
    + "Au revoir... "); 
    } // while 


} //main(...) 

public static char lecture(String invite1){ 

Scanner clavier = new Scanner(System.in); 
final String ERREUR = "La valeur entree est erronnee !\nReprenez-vous..."; 
final String VIDE = " "; 
String retour = ""; 

    do { 
     try { 
     System.out.print(invite1); 
     retour = clavier.nextLine().trim(); // Mise en forme; 

      for (int k = 0; k < retour.length(); k++) { 

       if(Character.isLetter(retour.charAt(k))) { 
       return retour.toUpperCase().charAt(0); 
       } // if 
      } // for 
     } // try 
     catch (Exception e) { 
     System.out.print(ERREUR); 
     }    
    }// do 
    while (!retour.equals(VIDE)); { 
    retour = "X"; 
    return retour.charAt(0); 
    } // while    
} // lecture(...) 

public static String remplaceTirets(String motAlea1, String tirets, 
char lettre) { 
String retour; 
String tempo = ""; 

    for (int j = 0; j < motAlea1.length(); j++) { 

     String lettre1 = Character.toString(lettre); 
     if (motAlea1.charAt(j) != lettre1.charAt(0)) { 
     tempo += tirets.charAt(j); 
     } // if  
      else { 
      tempo += lettre1.charAt(0); 
      } // else 
    tirets = tempo; 
    } // for  
    return retour = tirets;   
} //remplaceTirets(...) 

}//Tp    
+2

Просьба указать ** точную ошибку/исключение ** с полной обратной связью. –

+1

@Anita. Если вы уменьшите количество отправленных кодов, вам будет лучше (и быстрее). Если вы можете удалить код, который, как вы знаете, не является частью проблемы, вы должны, так как это поможет другим быстрее найти вашу проблему. – amccormack

+0

Если вы получаете IndexOutOfBoundsException на charAt, это потому, что значение индекса символа выходит за рамки для индексируемой строки. Это произойдет, если у шипов будет меньше motAlea1. –

ответ

1

Линия

tirets = tempo; 

должен быть вне для цикла.

изменить код

for (int j = 0; j < motAlea1.length(); j++) { 
    String lettre1 = Character.toString(lettre); 
    if (motAlea1.charAt(j) != lettre1.charAt(0)) { 
     tempo += tirets.charAt(j); 
    } // if  
     else { 
     tempo += lettre1.charAt(0); 
    } // else 
    //tirets = tempo; //REMOVE THIS LINE 
} // for 
tirets = tempo; //ADD THIS LINE 
+0

Спасибо всем за ваши ответы ... su-: that works..so эту проблему можно считать ответом ... когда я получу хорошее в этом, я определенно найду время ответить на эти новые вопросы в ответ. – Anita

+0

Нет проблем. Удачи. –

0

Вы обращаетесь к позиции в tirets на основе длины motAlea1. Я ожидаю, что motAlea1.length() > tirets.length().

for (int j = 0; j < motAlea1.length(); j++) { 

    String lettre1 = Character.toString(lettre); 

    if (motAlea1.charAt(j) != lettre1.charAt(0)) { 
     tempo += tirets.charAt(j); //THIS COULD FAIL!!! 
    }else{ 
     tempo += lettre1.charAt(0); 
    } 
    tirets = tempo; 
} 
+0

Спасибо всем за ваши ответы ... Я продолжу поиск подходящей линии для темпа + = tirets.charAt (0). полная ошибка следующая: – Anita

0

В этом цикле:

for (int j = 0; j < motAlea1.length(); j++) { 

    String lettre1 = Character.toString(lettre); 
    if (motAlea1.charAt(j) != lettre1.charAt(0)) { 
    tempo += tirets.charAt(j); 
    } // if  
     else { 
     tempo += lettre1.charAt(0); 
     } // else 
tirets = tempo; 
} // for  

Строка tirets короче motAlea1 и поэтому вы пытаетесь получить символ за ее конец.

+0

Полное исключение: Исключение в потоке «main» java.lang.StringIndexOutOfBoundsException Строка выходит за пределы диапазона: 1 – Anita

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