【问题标题】:Why if-else if-else if Statement in Java doesn't behave like Wiki said?为什么 if-else if-else if Java 中的语句不像 Wiki 所说的那样表现?
【发布时间】:2013-11-23 23:03:17
【问题描述】:

这就是我想要的。

如果word.length() > 0 则删除或插入单词。

所以,我们可以这样构造代码:

if(word.length()>0){
   if(action.equals("insert")){
       insert(word);
   }
   else if(action.equals("delete")){
       delete(word);
   }
}

但是,上面嵌套的 if 很难阅读,所以我们可以这样做

if(word.length()>0 && action.equals("insert")){
    insert(word);
}
else if(word.length()>0 && action.equals("delete")){
    delete(word);
}

但是,上面的代码重复了word.length() 2 次,这会导致重复 & 这不好。所以如果我们尝试

    if(word.length()>0){
        System.out.println("ok to insert or delete");
    }
    else if(action.equals("insert")){
        insert(word);
    }
    else if(action.equals("delete")){
        delete(word);
    }

但是,即使word.length==0,上述代码也会执行插入或删除操作。

这很令人困惑,因为 wiki http://en.wikipedia.org/wiki/Conditional_(programming),他们说:

"只有第一个条件之后的语句 为真将被执行。将跳过所有其他语句。”

如果条件1 那么 --声明 elseif 条件2 然后 -- 更多陈述 elseif 条件3 然后 -- 更多陈述; ... 别的 ——其他声明; 万一;

wiki 所说的意思是,if condition1 ==true 然后执行 condition2,但如果 if condition1 ==false 则跳过以下所有条件(条件 2、3、...)

但这在 Java 中不会发生吗? 我糊涂了??

【问题讨论】:

  • What wiki said mean, if condition1 ==true then do the condition2 什么?没有。
  • 它说“只有第一个条件为真的语句才会被执行。所有其他语句都将被跳过。”
  • “else”的意思是“否则”。
  • 使用最顶层,嵌套if。真的没有什么问题。
  • 你的第一个解决方案很好。

标签: java if-statement


【解决方案1】:

它可以像这样重写你的代码:

if(word.length()==0){
    System.out.println("word length is 0");
} else if(action.equals("insert")){
    insert(word);
} else if(action.equals("delete")){
    delete(word);
}

它被读作:如果字长为0,它将打印“字长为0”,否则:如果动作等于“插入”,它将调用方法插入,否则如果动作等于“删除”,则调用删除方法。

每个 if 结构都有一个语句,如果给定条件为真,则执行该语句。并且仅执行此语句,{} 可用于对更多语句(代码块)进行分组。所以可以说在 if-elseif 结构中只有第一个条件为真的语句才会被执行。

第一个条件有一个用于 true 情况的块和一个用于 else 情况的语句(if 结构)。第二个条件相同,第三个条件只有一个块用于真实情况。查看语句分隔的另一种方法是:

if(word.length()==0){
    System.out.println("word length is 0");
} else 
    if(action.equals("insert")){
       insert(word);
    } else 
       if(action.equals("delete")){
           delete(word);
       }

在真假情况下使用块,你会得到类似的东西:

if(word.length()==0){
    System.out.println("word length is 0");
} else {
    if(action.equals("insert")){
       insert(word);
    } else {
       if(action.equals("delete")){
           delete(word);
       }
    }
}

结果是一样的。

【讨论】:

    【解决方案2】:

    您误读了 wiki。但是,如果您不喜欢选项 1(我认为这很好),那么让插入和删除方法查看单词长度:

    public void insert(String word) {
       if( word == null || work.isEmpty() ) return
    }
    

    那么你有:

    if( "insert".equals(action) ){
        insert(word);
    }
    else if( "delete".equals(action) ){
        delete(word)
    }
    

    我使用 "insert".equals(action) 而不是 action.equals("insert") 以防万一 "action" 为空。

    【讨论】:

      【解决方案3】:

      wiki 是正确的,只是你的条件倒退了。

      "但是,即使 word.length==0,上述代码也会执行插入或删除操作。"

      不完全是。该代码将执行插入或删除 if word.length == 0。如果word.length > 0,它将打印消息,然后将跳过插入和删除块。

      应该是这样的:

       if(word.length() == 0) //if condition1 is true, we will skip all the other blocks after this one
       {
              System.out.println("Cannot insert or delete");
       }
       else if(action.equals("insert")) //okay, condition1 must have been false at this point
       {
              insert(word);
       }
       else if(action.equals("delete")) //and condition2 must have been false at this point
       {
              delete(word);
       }
      

      【讨论】:

        【解决方案4】:
        if(word.length()>0){
                System.out.println("ok to insert or delete");
            }
            else if(action.equals("insert")){
                insert(word);
            }
            else if(action.equals("delete")){
                delete(word);
            }
        

        在这里你做了两个不同的检查,这就是问题所在 首先检查字长,然后检查动作

        我认为最好的方法就是像你第一次那样做

        if(word.length()>0){
           if(action.equals("insert")){
               insert(word);
           }
           else if(action.equals("delete")){
               delete(word);
           }
        }
        

        【讨论】:

          猜你喜欢
          • 2019-04-09
          • 2023-03-28
          • 1970-01-01
          • 2017-08-12
          • 2015-10-28
          • 1970-01-01
          • 1970-01-01
          • 2018-09-19
          • 2014-10-29
          相关资源
          最近更新 更多