Java-цикл не заканчивается в моем коде

По какой-то причине цикл my for не заканчивается в моем методе CapitalizeFirstSentence. Я установил точку останова в этой строке, и условие (i!= -1) неудовлетворено, поэтому цикл должен завершиться, но это не так!

Это работает, когда я использую (i > 0) для условия.

Я не уверен, что происходит здесь.

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();

    }

}

Ответы

Ответ 1

Во-первых, не рекомендуется изменять переменную, управляющую циклом, внутри цикла for - довольно сложно читать и понимать такой код и подвержен ошибкам.

Теперь, к вашему примеру:

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

Это означает:

  • Инициализировать i до temp.indexOf(". ")+1, который всегдa >= 0
  • Завершить, если i == -1
  • После каждой итерации приращение i на 1

Итак:

  • В начале цикл не будет завершен, потому что инициализация всегда возвращает >= 0
  • Каждая итерация тела цикла устанавливает i = temp.indexOf(". ", i);, которая равнa >= -1
  • После каждой итерации i будет увеличиваться на 1, поэтому теперь будет >= 0
  • Поскольку i всегдa >= 0, он никогда не будет удовлетворять условию i == -1 и, таким образом, никогда не завершит

Ответ 2

Эта строка: for (int i = temp.indexOf(". ")+1; i != -1; i++) инициализирует я результатом indexOf + 1. IndexOf дает -1, если нет удара, но вы всегда добавляете 1 к нему во время инициализации, поэтому он никогда не будет меньше 0.

Использование i > 0 выглядит отлично.