2015-10-04 1 views
1

Donc je fais un programme qui décode un message codé, il compile mais quand je le lance java.lang.StringIndexOutOfBoundsException: String index out de portée: 1 erreur et je ne peux pas comprendre d'où cela vient.JAVA - Indice de chaîne hors de portée, je ne comprends pas pourquoi

Voici le code:

import java.util.Scanner; 

public class ReverseCodeProgram { 
    public static int i; 

    public static String decodeLetter(String s){ 
     String a = ""; 
     if ((s.charAt(0) == '.')) 
     a = "E"; 
     if ((s.charAt(0) == '-')) 
     a = "T"; 
     if ((s.charAt(0) == '-') && (s.charAt(1) == '-')) 
     a = "M"; 
     if ((s.charAt(0) == '-') && (s.charAt(1) == '.')) 
     a = "N"; 
     if ((s.charAt(0) == '.') && (s.charAt(1) == '.')) 
     a = "I"; 
     if ((s.charAt(0) == '.') && (s.charAt(1) == '-')) 
     a = "A"; 
     if ((s.charAt(0) == ' ') && (s.charAt(1) == ' ')) 
     a = " "; 
     if ((s.charAt(0) == '.') && (s.charAt(1) == '-') && (s.charAt(2) == '.')) 
     a = "R"; 
     if ((s.charAt(0) == '.') && (s.charAt(1) == '.') && (s.charAt(2) == '.')) 
     a = "S"; 
     if ((s.charAt(0) == '.') && (s.charAt(1) == '.') && (s.charAt(2) == '-')) 
     a = "U"; 
     if ((s.charAt(0) == '-') && (s.charAt(1) == '.') && (s.charAt(2) == '.')) 
     a = "D"; 
     if ((s.charAt(0) == '-') && (s.charAt(1) == '-') && (s.charAt(2) == '.')) 
     a = "G"; 
     if ((s.charAt(0) == '-') && (s.charAt(1) == '.') && (s.charAt(2) == '-')) 
     a = "K"; 
     if ((s.charAt(0) == '-') && (s.charAt(1) == '.') && (s.charAt(2) == '-')) 
     a = "O"; 
     if ((s.charAt(0) == '.') && (s.charAt(1) == '-') && (s.charAt(2) == '-')) 
     a = "W"; 
     if ((s.charAt(0) == '-') && (s.charAt(1) == '.') && (s.charAt(2) == '.') && (s.charAt(3) == '.')) 
     a = "B"; 
     if ((s.charAt(0) == '-') && (s.charAt(1) == '.') && (s.charAt(2) == '-') && (s.charAt(3) == '.')) 
     a = "C";  
     if ((s.charAt(0) == '.') && (s.charAt(1) == '.') && (s.charAt(2) == '-') && (s.charAt(3) == '.')) 
     a = "F"; 
     if ((s.charAt(0) == '.') && (s.charAt(1) == '.') && (s.charAt(2) == '.') && (s.charAt(3) == '.')) 
     a = "H"; 
     if ((s.charAt(0) == '.') && (s.charAt(1) == '-') && (s.charAt(2) == '-') && (s.charAt(3) == '-')) 
     a = "J"; 
     if ((s.charAt(0) == '.') && (s.charAt(1) == '-') && (s.charAt(2) == '.') && (s.charAt(3) == '.')) 
     a = "L"; 
     if ((s.charAt(0) == '.') && (s.charAt(1) == '-') && (s.charAt(2) == '-') && (s.charAt(3) == '.')) 
     a = "P"; 
     if ((s.charAt(0) == '-') && (s.charAt(1) == '-') && (s.charAt(2) == '.') && (s.charAt(3) == '-')) 
     a = "Q"; 
     if ((s.charAt(0) == '.') && (s.charAt(1) == '.') && (s.charAt(2) == '.') && (s.charAt(3) == '-')) 
     a = "V"; 
     if ((s.charAt(0) == '-') && (s.charAt(1) == '.') && (s.charAt(2) == '.') && (s.charAt(3) == '-')) 
     a = "X"; 
     if ((s.charAt(0) == '-') && (s.charAt(1) == '.') && (s.charAt(2) == '-') && (s.charAt(3) == '-')) 
     a = "Y"; 
     if ((s.charAt(0) == '-') && (s.charAt(1) == '-') && (s.charAt(2) == '.') && (s.charAt(3) == '.')) 
     a = "Z"; 
     s = a; 
     return s; 
    } 
    public static void main(String[] args) { 
    System.out.println("Please enter the sentence in Morse code"); 
    String code = new Scanner(System.in).nextLine(); 
    String decodedCharacter = "", character = "", decodedCode = ""; 
    for (i = 0; i < code.length(); i++){ 
     if (code.charAt(i) == ' '){ 
     for (int j = i - 4; j < i; j++){   
     character += code.charAt(j); 
     decodedCharacter = "" + decodeLetter(character); 
     } 
     decodedCode += decodedCharacter; 
    } 

    } 
    System.out.println(decodedCode);  
    } 
} 
+8

Lorsque vous posez au sujet de toute erreur ou une exception, toujours après le message d'erreur complète/d'exception dans tous ses éléments et indiquer quelle ligne est la cause. –

+0

Qu'est-ce que decodeLetter? Pourriez-vous mettre le reste du code dans cette méthode? –

+0

Pour mettre à jour votre question et fournir plus d'informations comme l'option full stacktrace, input et expected output utilisez [edit] placé sous votre poste. – Pshemo

Répondre

0
for (int j = i - 4; j < i; j++) 

La ligne ci-dessus est la cause de votre erreur. C'est parce que i est inférieur à 4 lorsqu'il atteint cette ligne. Essayez plutôt ce qui suit:

public static void main(String[] args) { 
    System.out.println("Please enter the sentence in Morse code"); 
    String code[] = new Scanner(System.in).nextLine().split(" "); 
    String decodedCode = ""; 
    for(String character : code){ 
     decodedCode += decodeLetter(character); 
    } 

    System.out.println(decodedCode); 
} 

Il divise l'entrée en un tableau de chaînes par "caractère", puis itère sur lui.

0

Pour votre entrée, l'exception se produit à if ((s.charAt(0) == '.') && (s.charAt(1) == '.'))s est juste . et vous essayez d'accéder au deuxième caractère de celui-ci.

Vous devriez avoir un changement dans votre boucle pour lire les caractères:

 for (i = 0; i < code.length(); i++) { 
      if (code.charAt(i) == ' ') { 
       character = ""; //Clear the value before read 
       for (int j = i - 4; j < i; j++) { 
        character += code.charAt(j); 
       } 
       decodedCharacter = decodeLetter(character); //This should be outside the for(int j = 1-4 loop for you to read the 4 chars and then pass to decode. 
       decodedCode += decodedCharacter; 
      } 
     }