首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java for循环没有在我的代码中终止

Java for循环没有在我的代码中终止
EN

Stack Overflow用户
提问于 2016-01-21 16:21:52
回答 2查看 1.3K关注 0票数 16

由于某种原因,我的For循环没有在我的CapitalizeFirstSentence方法中终止。我在该行设置了一个断点,但条件(i != -1)未满足,因此循环应该终止,但它没有!

当我使用(i > 0)作为条件时,它就起作用了。

我不知道这是怎么回事。

代码语言:javascript
复制
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();

    }

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-21 16:31:38

首先,在for循环中修改循环控制变量并不是一个好主意,因为这样的代码很难阅读和理解,而且容易出错。

现在,让我们来看看你的例子:

代码语言:javascript
复制
for (int i = temp.indexOf(". ")+1; i != -1; i++)

这意味着:

  • i初始化为temp.indexOf(". ")+1,它始终为>= 0
  • Terminate if i == -1
  • After每次迭代,将i递增1

所以:

  • 在开始时,循环不会终止,因为每次迭代初始化总是返回>= 0
  • ,循环体将设置i = temp.indexOf(". ", i);,它是每次迭代后的>= -1\f25
  • i将递增1,因此它现在将是>= 0

<代码>H122,因为<代码>D23始终为>= 0,它永远不会满足条件<代码>D24,因此永远不会终止<代码>H225<代码>F226

票数 24
EN

Stack Overflow用户

发布于 2016-01-21 16:25:32

这一行:for (int i = temp.indexOf(". ")+1; i != -1; i++)将i初始化为indexOf + 1的结果。如果没有命中,IndexOf会给出-1,但你总是在初始化时加上1,所以它永远不会小于0。

在这里,使用i > 0似乎完全没问题。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34918612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档