1

IndexOutOfBoundsExceptionカスタム関数を呼び出す行に at が表示されます : motCars = remplaceTirets(motAlea, motCars, lettreDon);。この関数は、指定された文字が単語内の文字と等しい場合、1 つ以上のダッシュを文字に変換することになっています) と、実際の関数の行では、次のように記述されています。 tempo += tirets.charAt(j);

結果は次のとおりです: _ _ _ _ _ _ (これらのダッシュの量は、プログラムによって選択された単語によって異なります。これは機能し、手紙を与えるように求められますが、手紙を与えると次のようになります:

スレッド「メイン」での例外 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               
4

3 に答える 3

1

この線

tirets = tempo;

for ループの外にある必要があります。

コードを次のように変更します

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
于 2013-04-08T03:36:14.083 に答える
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    

Stringtiretsはより短いため、 end を超えてmotAlea1文字を取得しようとしています。

于 2013-04-08T03:40:02.950 に答える
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; 
}
于 2013-04-08T03:37:33.787 に答える