2015-02-19 2 views
2

Я написал класс TokenizableString, который токенизирует строку, указанную в качестве ввода от пользователя. Вот пример того, как он должен идтиArrayIndexOutOfBounds, не удалось найти его источник

набирает

"My name is methos" 

Я должен видеть в консоли следующего

'My' 
'name' 
'is' 
'methos' 

Там одна проблемы, когда я ввожу следующий вход: "Badr " я получаю следующее:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4 
    at exercicesPOO.TokenizableString.<init>(TokenizableString.java:40) 
    at exercicesPOO.TokenizableString.main(TokenizableString.java:127) 
Java Result: 1 

Принимающая сторона s желаемый выход должен быть: 'Badr'. Обратите внимание, что пробелы в конце слова удаляются (в моем коде есть метод).

Я долгое время просматривал свой код, но до сих пор не могу найти, откуда приходит ошибка «индекс за пределами границ».

Я попытался запустить отладчик, кажется, он никогда не выходит за рамки вызова конструктора для этого конкретного ввода: "Badr ".

Также вы были бы добры и отметили читаемость/качество моего кодирования. Любое предложение/замечания более чем приветствуются. Спасибо заранее.

P_S: Я использую Netbeans.

Вот код:

package debugging; 


import java.util.ArrayList; 
import java.util.Locale; 
import java.util.Scanner; 

public class TokenizableString { 
     static Scanner scanner = new Scanner(System.in).useLocale(Locale.US); 
     private String contenu; 
     private int from; 
     private int len;  

     //Constructeurs 
     public TokenizableString(String contenu) 
     { 
       this.contenu = contenu; 
       System.out.print(this.contenu); 
       System.out.println("<--- Ended here"); 
       this.removeExtraSpaces(); 
       System.out.print(this.contenu);    
       System.out.println("<--- Ended here"); 
       this.from=0; 
       this.len = 0; 
       char[] contenuChar = this.contenu.toCharArray(); 
       int i = 0; 
       do 
       { 
         this.len++; 
         i++; 
       }while(i<contenuChar.length && contenuChar[i] != ' '); 
       // La condition est qu'il faut calculer la longueur de la première séquence de lettres (du premier mot) en itérant soit jusqu'au prochain ' ' (espace) ou jusqu'à atteindre la fin de la phrase. 
       //The condition is that we have to calculate the length of the first sequence of letters (first word) by iterating until the next ' ' (blank space) or until we reach the end of the sentence. 
     } 

     //Methods 

     //removeExtraSpaces() removes the spaces that the user would have entered at the end of the inputed string for example : "Badr    " would become "Badr" 
     private void removeExtraSpaces() 
     { 
       boolean Acc = true; 
       do 
       { 
         if(this.contenu.charAt(this.contenu.length()-1)==' ') 
         { 
           char[] temp = new char[this.contenu.length()-1]; 

           for(int i = 0 ; i < this.contenu.length() -1; i++) 
           {           
             temp[i] = this.contenu.charAt(i); 
           } 
           String tempStr =""; 
           for(int i = 0; i < temp.length; i++) 
           { 
             tempStr += temp[i]; 
           } 
           this.contenu = tempStr;      
           if(this.contenu.charAt(this.contenu.length()-1)==' ') 
           { 
             Acc= false; 
           } 
           else 
           { 
             Acc = true; 
             break; 
           } 
         }       
       }while(Acc == false); 
     } 


     //nextToken() places the 'from' in the beggining of a word and calculates the length of that given word via 'len'. If there we reach the end of the sentence this method will return false. 
     public boolean nextToken() 
     {     
       char[] contenuChar = this.contenu.toCharArray(); 

       if ((this.from+this.len+1) < contenuChar.length && ((this.from == 0 && contenuChar[this.from+this.len] == ' ') || (this.from !=0 && contenuChar[this.from - 1] == ' '))) 
       {     

         this.from += (this.len +1); 
         this.len = 0;      
         int i = this.from; 
         while(i < contenuChar.length) 
         { 
           if(contenuChar[i] != ' ') 
           { 
             this.len++; 
             i++;  
           } 
           else 
           { 
             break; 
           } 
         }       
         //Nous avons donné une nouvelle valeures aux variables from et len. 
         //System.out.println("from = "+this.from+" || len= "+this.len); 
         return true; 
       } 
       return false; 
     } 

     //putting the given words of a sentence via previous method into a dynamic array. 
     public void tokenize() 
     { 
       ArrayList <String> mots = new ArrayList<>(); 
       do 
       {      
         String mot = ""; 
         for(int i = from; i < (this.len+this.from); i++) 
         { 
           mot += contenu.charAt(i); 
         } 
         mots.add(mot); 
       }while(this.nextToken() == true); 

       for(String mot : mots) 
       { 
         System.out.println("'"+mot+"'"); 
       } 
     } 
     public static void main(String[] args) { 
       String phrase; 
       System.out.println("Entrez une chaine :"); 
       phrase = scanner.nextLine(); 
       TokenizableString toToken = new TokenizableString(phrase); 
       toToken.tokenize(); 
    } 
} 
+0

Почему вы не используете .trim(), чтобы удалить пробелы? – SpaceCowboy

+0

Потому что я должен «осмыслить и переписать» функции, такие как .trim() или split(). Это пункт упражнений. – Aetos

+2

Этот вопрос не является дубликатом того, что указал Джаррод Роберсон. На вопрос http://stackoverflow.com/questions/16316810/exception-arrayindexoutofbounds даже не ответил. – Aetos

ответ

2

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

+0

&& (Логическое И) предположительно является коммутативным. – Aetos

+0

, так что ваш contenuChar имеет длину 3. вы на i = 3, что происходит? Вы проверяете, что contenuChar [3]! = '', И вы уже занимаетесь размером таблицы, так как последние доступные индексы - 2. Если вы измените порядок работы. Операция && является ярлыком, когда первая операция дает false, результаты && должны быть ложными, поэтому они не оцениваются и вы не являетесь содержимым chekcign вне диапазона вашей таблицы. – Zielu

+0

Я переключил их, все еще не работает. РЕДАКТИРОВАТЬ: Подождите, omg, был еще один, и я тоже переключил его, и это сработало. THANKS – Aetos

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