java if语句没有打破“for循环”

时间:2012-01-04 19:14:16

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

我是java的新手,但我想我在这几周里做得很好。但现在我陷入了这个循环。

这是我班上的一个方法。为了帮助我调试,我添加了#34; myString"字符串和"语法"列出这个方法,以展示正在发生的事情,并保持简单,至少现在。

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

正如你在循环中看到的那样,我想打破&#34; for循环&#34;当列表的元素,&#34;语法&#34;是&#34; +&#34;。 (我正在显示&#34; +&#34;这里可以是实际程序中的任何内容。)

这是输出,当运行此方法时:

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

当循环找到&#34; +&#34;但似乎&#34;如果陈述&#34;根本不工作,因此&#34; indexNeeded&#34;没有改变。

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

8 个答案:

答案 0 :(得分:10)

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

变化:

syntax[index] == "+"

syntax[index].equals("+")

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

答案 1 :(得分:3)

替换

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.

当你做等于它时,它实际上比较了内容。

答案 2 :(得分:2)

你应该写:

syntax[index].equals("+")

"+"是对String的引用,syntax[index]是另一个。但是在这里你要比较对象本身,而不是它们的参考。

如果你选择任何类的ab两个对象,a == b将测试引用是否相同。测试它们是“相同”的是a.equals(b)

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

答案 3 :(得分:1)

对于String,你需要做

syntax[index].equals("+")

答案 4 :(得分:1)

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

花一点时间看看之间的区别:

syntax[index] == "+"

"+".equals(syntax[index])

它命令你不允许在语法[index]

中使用可能的空指针

答案 5 :(得分:0)

这是一种有趣,有教育意义的方法来解决您的问题。向您的方法添加对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

答案 6 :(得分:-1)

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

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

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

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

回到相等运算符:

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

有关详细信息,请参阅this page

答案 7 :(得分:-2)

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