2016-01-21 17 views
16

Per qualche motivo il mio ciclo for non termina con il mio metodo CapitalizeFirstSentence. Ho impostato un breakpoint su quella linea e la condizione (i! = -1) non è soddisfatta, quindi il ciclo dovrebbe terminare, ma non lo fa!Java for loop non sta terminando nel mio codice

Funziona quando uso (i> 0) per la condizione.

Non sono sicuro di cosa sta succedendo qui.

import javax.swing.JOptionPane; 

public class SentenceCapitalizer { 


    //Main Method 
    public static void main(String[] args) { 
     String input; //creates a String to hold keyboard input 

     //Prompt the user to enter a String using JOptionPane and set it equal to input 
     input = JOptionPane.showInputDialog("Enter a string. "); 

     //Display the new String with the first letter of each sentenced capitalized 
     JOptionPane.showMessageDialog(null, CapitalizeFirstSentence(input)); 

     //Exit the program 
     System.exit(0); 
    } 


    //Capitalize first letter of each sentence 
    public static String CapitalizeFirstSentence(String in) 
    { 
     //Creates a StringBuilder object initiralized to the String argument "in" 
     StringBuilder temp = new StringBuilder(in); 

     //Capitalize first letter of the string if string length is > 0 
     if (temp.length() > 0) 
     { 
      temp.setCharAt(0, Character.toUpperCase(temp.charAt(0))); 
     } 

     //sets i equal to index of the space, 
     //keep capitalizing first letters of each sentence (loops each time it capitlizes a letter) 
     //until very end of the String 
     for (int i = temp.indexOf(". ")+1; i != -1; i++) 
     { 
      //Checks for extra spaces and moves index to first character of next sentence 
      while (i < temp.length() && temp.charAt(i) == ' ') 
      { 
       i++; 
      } 

      //Capitalize character 
      temp.setCharAt(i, Character.toUpperCase(temp.charAt(i))); 

      //Index the end of the sentence 
      i = temp.indexOf(". ", i); 
     } 

     //Convert temp to a String and return our new first-sentenced-capitalized String 
     return temp.toString(); 

    } 

} 
+0

qual è il valore che hai fornito nella variabile stringa 'in'? – SMA

+1

Possibile duplicato di [Che cos'è un debugger e come può aiutarmi a diagnosticare i problemi] (http://stackoverflow.com/questions/25385173/what-is-a-debugger-and-how-can-it-help-me -diagnosi-problemi) – Raedwald

risposta

24

In primo luogo, non è una buona idea modificare la variabile di controllo del ciclo all'interno di un ciclo for - è piuttosto difficile leggere e comprendere tale codice ed è soggetto a errori.

Ora, per il tuo esempio:

for (int i = temp.indexOf(". ")+1; i != -1; i++) 

Ciò significa:

  • inizializzazione i-temp.indexOf(". ")+1, che è sempre> = 0
  • Termina se i == -1
  • Dopo ogni iterazione, incremento i di 1

Quindi:

  • All'inizio, il ciclo non terminerà perché l'inizializzazione restituisce sempre> = 0
  • ogni iterazione, il corpo del ciclo imposterà i = temp.indexOf(". ", i);, che è> = -1
  • Dopo ogni iterazione, i viene incrementato di 1, quindi verrà ora> = 0
  • Come i è sempre> = 0, non potrà mai soddisfare la condizione i == -1 e pertanto verrà mai interrompere
+0

Ah grazie! Questo ha senso. –

7

Questa riga: for (int i = temp.indexOf(". ")+1; i != -1; i++) inizializza i come il risultato di indexOf + 1. IndexOf dà -1 se non c'è hit, ma ne aggiungi sempre 1 durante l'inizializzazione, quindi non sarà mai inferiore a 0.

L'utilizzo di i > 0 sembra perfettamente a posto.

+2

Non è così semplice - l'OP sta modificando 'i' all'interno del loro ciclo. –

+1

Sì, è vero. La tua risposta è migliore – sfThomas