嵌套if,否则如果没有括号

时间:2014-07-29 05:12:41

标签: java

我的代码曾经是:

for(int i=1; i<par.length(); i++)
    {
        if( '}'==(par.charAt(i)) )
            if(parStack.pop()!='{')
                return false;

        else if( ')'==(par.charAt(i)) )
                if(parStack.pop()!='(')
                    return false;

        else if( ']'==(par.charAt(i)) )
                if(parStack.pop()!='[')
                    return false;

        else if ( '{'==(par.charAt(i)) || '['==(par.charAt(i)) || '('==(par.charAt(i)))
                parStack.push(par.charAt(i));
    }

不幸的是,它无法正常工作。由于错误的性质(仅适用于{}括号开始/结束),我意识到else是多余的(因为该方法无论如何都会返回false),所以我删除它,代码看起来像这样:

for(int i=1; i<par.length(); i++)
    {
        if( '}'==(par.charAt(i)) )
            if(parStack.pop()!='{')
                return false;

        if( ')'==(par.charAt(i)) )
                if(parStack.pop()!='(')
                    return false;

        if( ']'==(par.charAt(i)) )
                if(parStack.pop()!='[')
                    return false;

        if ( '{'==(par.charAt(i)) || '['==(par.charAt(i)) || '('==(par.charAt(i)))
                parStack.push(par.charAt(i));
    }

然后代码工作得很好。我想知道为什么会出现这个错误?我认为上面的代码不需要括号,因为它是所有单个语句。

2 个答案:

答案 0 :(得分:3)

只是因为你以这种方式缩进代码,它不会像你期望的那样工作(这不是Python)。

实际上,行

if( '}'==(par.charAt(i)) )
    if(parStack.pop()!='{')
        return false;

else if( ')'==(par.charAt(i)) )
        if(parStack.pop()!='(')
            return false;
...

相当于:

if( '}'==(par.charAt(i)) )
    if(parStack.pop()!='{')
        return false;
    else if( ')'==(par.charAt(i)) )
        if(parStack.pop()!='(')
            return false;
...

这不是你想要的。

你可以做些什么来避免这种情况?你可以使用带有自动包围的IDE,比如Eclipse。或者只是自己使用括号:

if ('}' == (par.charAt(i))) {
    if (parStack.pop() != '{') {
        return false;
    }
} else if (')' == (par.charAt(i))) {
    if (parStack.pop() != '(') {
        return false;
    }
} ...

答案 1 :(得分:1)

我认为这是因为第一个else应用于代码的这一部分中最近的if语句,即第二个if语句。:

if( '}'==(par.charAt(i)) )
            if(parStack.pop()!='{')
                return false;

        else if( ')'==(par.charAt(i)) )
                if(parStack.pop()!='(')
                    return false;

为了使其按预期工作,您至少需要将外部ifs括起来:

if( '}'==(par.charAt(i)) ) 
{
            if(parStack.pop()!='{')
                return false;
}
        else if( ')'==(par.charAt(i)) )
{
                if(parStack.pop()!='(')
                    return false;
}
....