【问题标题】:java if statement not breaking the "for loop" [duplicate]java if语句不破坏“for循环”[重复]
【发布时间】:2012-01-04 19:14:16
【问题描述】:

我是 Java 新手,但我认为这几周我自学得很好。但现在我陷入了这个循环。

这是我班上的一个方法。为了帮助我调试,我在这个方法中添加了“myString”字符串和“syntax”列表来演示正在发生的事情并保持简单,至少现在是这样。

public void getIndex(){
    String myString = "2 2 + 3 5";
    String[] syntax = myString.split(" ");

    for (int index = 0; index < syntax.length; index++){
        System.out.println("current index is: " + index);
        System.out.println("It has: " + syntax[index]);
        // these print statements are made to help me debug
        if (syntax[index] == "+"){
            indexNeeded = index;
            break;
        }
    }
    System.out.println("Index Needed: " + indexNeeded);   

正如您在循环内部看到的那样,我想在列表元素“语法”为“+”时打破“for循环”。 (我在这里显示“+”,但它可以是实际程序中的任何内容。)

这是运行此方法时的输出:

current index is: 0
It has: 2
current index is: 1
It has: 2
current index is: 2
It has: +
current index is: 3
It has: 3
current index is: 4
It has: 5
Index Needed: 0

当找到“+”时,循环应该已经停止,但似乎“if 语句”根本不起作用,因此“indexNeeded”没有改变。

这是一个简单的方法,但我在这里做错了什么?

【问题讨论】:

  • 这都是关于字符串和字符的相等性测试。与ifbreak 无关。你真的需要一个更好的教程,一个更完整地涵盖字符串相等检查的教程。
  • @S.Lott -- 这是一个容易犯的错误,即使您对该主题相当熟悉。很可能是新手,无论他们是否接触过关于字符串比较的讲座。
  • @HotLicks:从来没有说过这不容易。但是“我认为我自学做得很好”表明需要更好的教程。
  • 是的,但这是你通过实践学到的东西——在犯了 2-3 次错误之后你就会“明白”(*)——比你只听听要好得多讲座。 (*)(尽管在这一点上的复发非常普遍,即使对于那些已经编程了几十年的人也是如此。)
  • 那么你犯了多少次错误?? (说实话,现在!)

标签: java if-statement for-loop indexing break


【解决方案1】:

您正在尝试将字符串与== 进行比较。那不行,你需要使用.equals()

改变:

syntax[index] == "+"

syntax[index].equals("+")

== 仅在两个对象引用同一个实例时才返回 true。当字符串的内容相同时,equals() 将返回 true。这就是你想要的。

【讨论】:

  • @jbchichoko,字符串在 Java 中是独特且棘手的,因为有时 == 可以很好地处理字符串,因为 Java 在内部处理字符串的方式。但是,您仍应始终使用 equals
【解决方案2】:

替换

if (syntax[index] == "+"){

if (syntax[index].equals("+")){

当您尝试== 时,它比较引用和syntex[index] 不是指文字"+" 所在的相同位置。所以他们不相等。

// If syntax[index] get '+' value from somewhere but not literal
if(syntax[index] == "+" ) // is false
// right way is 
if(syntax[index].equals("+")) // is true

// If syntax[index] get '+' value from literal
syntax[index] = "+";
if(syntax[index] == "+" ) // is true
// This approach is faster but has mentioned above has limitations.

当你执行 equals 时,它实际上是比较内容。

【讨论】:

    【解决方案3】:

    你应该写:

    syntax[index].equals("+")
    

    "+" 是对字符串的引用,syntax[index] 是另一个。但是在这里你想比较对象本身,而不是它们的引用。

    如果您获取两个对象 ab 的任何类,a == b 将测试 references 是否相同。测试它们是否“相同”写入a.equals(b)

    你应该仔细阅读Java的.equals() documentation,它是理解的基础部分。

    【讨论】:

      【解决方案4】:

      对于String,你需要做的

      syntax[index].equals("+")
      

      【讨论】:

      • == 用于测试两个对象引用(内存位置)是否相同。 equals 用于测试对象是否相等。对于对象,即使它们的属性都相等,它们也可以有不同的引用。在 String 的情况下,即使所有字符都相同,它们可能指的是不同的内存位置。
      • 是的,我知道 - 当它真正适用于所有对象时,您的回答说“for String”。
      【解决方案5】:

      如果要比较字符串的值,则需要使用 .equals(),但如果要比较引用,则使用运算符 ==。这是新手常犯的错误。

      花点时间看看两者之间的区别:

      syntax[index] == "+"
      

      "+".equals(syntax[index])
      

      您不允许在 syntax[index]

      中使用可能的空指针的命令

      【讨论】:

        【解决方案6】:

        这是解决问题的一种有趣且具有教育意义的方法。在您的方法中添加对String.intern() 的调用,它将正常工作。惊艳你的朋友! :)

        public int getIndex()
        {
            String myString = "2 2 + 3 5";
            String[] syntax = myString.split(" ");
            int indexNeeded = -1;
            for (int index = 0; index < syntax.length; index++)
            {
                System.out.println("current index is: " + index);
                System.out.println("It has: " + syntax[index]);
                // these print statements are made to help me debug
                if (syntax[index].intern() == "+")
                {
                    indexNeeded = index;
                    break;
                }
            }
            return indexNeeded;
        }
        

        请注意,从方法返回值比在类范围内使用变量要好。类范围的变量应该保留给可以被视为对象属性的数据。 indexNeeded 不符合该描述,而且对于 int 来说,这是一个糟糕的名字 - 听起来应该是 boolean

        【讨论】:

          【解决方案7】:

          Java 中的相等检查有两种形式。

          相等运算符“==”检查两个变量是否引用同一个对象。在您的情况下,此测试失败,因为尽管它们的内容相同,但您指的是两个不同的字符串对象。

          .equals() 方法可用于每个 Java 对象,并提供可扩展的相等性检查。对于字符串,请考虑以下几点:

          "+".equals("+") // evaluates to true
          

          回到相等运算符:

          "+" == "+" // evaluates to false
          

          更多详情请参阅this page

          【讨论】:

          • -1 因为"+" == "+" 的计算结果为真。你需要研究一下Java是如何处理Strings的。
          • 我发现这个答案信息丰富:stackoverflow.com/a/767655/513872 本质上,您是对的,但这只是因为 JVM 进行了优化。不同之处在于构造字符串的时间和地点。字符串不保证运算符相等。
          • 我应该补充一下,这种优化在规范中,但在 Oracle JVM 之外不能保证。 OpenJDK、IBM JDK 和其他用户可能会看到不同的结果。
          【解决方案8】:

          使用返回;而不是休息; 它对我有用

          【讨论】:

          • 他对 break 没有问题,但有 if 语句围绕它。
          • sry 我的英语不好,我没读好,因为我在搜索中输入了它并找到了这个,我是新手
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-07-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-05-04
          • 1970-01-01
          • 2014-03-30
          相关资源
          最近更新 更多