2016-01-21 23 views
16

Z jakiegoś powodu moja pętla for nie kończy się w mojej metodzie CapitalizeFirstSentence. Ustawiłem punkt przerwania w tej linii i warunek (i! = -1) jest niezmieniony, więc pętla powinna się zakończyć, ale tak nie jest!Java dla pętli nie kończy się moim kodem

Działa, gdy używam (i> 0) dla warunku.

Nie jestem pewien, co się tutaj dzieje.

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

jaka jest wartość podana w zmiennej łańcuchowej 'in'? – SMA

+1

Możliwy duplikat [Czym jest debugger i jak może mi pomóc zdiagnozować problemy] (http://stackoverflow.com/questions/25385173/what-is-a-debugger-and-how-can-it-help-me -diagnose-problems) – Raedwald

Odpowiedz

24

Po pierwsze, nie jest dobrym pomysłem modyfikowanie zmiennej sterującej pętlą wewnątrz pętli for - dość trudno jest odczytać i zrozumieć taki kod, i jest on podatny na błędy.

Teraz na swoim przykładzie:

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

To znaczy:

  • Initialize i do temp.indexOf(". ")+1, który jest zawsze> = 0
  • Zakończyć jeśli i == -1
  • Po każdej iteracji inkrementacja i przez 1

Więc:

  • Na początku, cykl nie zostanie zakończony, ponieważ zawsze zwraca inicjalizacji> = 0
  • każdej iteracji pętli ciało będzie ustawiony i = temp.indexOf(". ", i);, która wynosi> = -1
  • Po każdej iteracji i zostanie zwiększony o 1, więc będzie teraz wynosić> = 0
  • Jak i jest zawsze> = 0, to nigdy nie będzie spełniać warunek i == -1 a więc nigdy nie zakończy
+0

Ah dzięki! To ma sens. –

7

linię: for (int i = temp.indexOf(". ")+1; i != -1; i++) inicjuje i być wynikiem indexOf + 1. IndexOf daje -1, jeśli nie ma trafienia, ale zawsze dodajesz 1 do niego podczas inicjalizacji, więc nigdy nie będzie mniejsze niż 0.

Wydaje się, że jest tam idealnie idealnie.

+2

To nie jest takie proste - OP modyfikuje "i" w ich pętli. –

+1

Tak, to prawda. Twoja odpowiedź jest lepsza. – sfThomas