【问题标题】:Roid: if(); do not caused any prohibition机器人:如果();不造成任何禁止
【发布时间】:2013-09-23 11:28:20
【问题描述】:

我看到了奇怪的情况:在我的 Android 应用代码中使用类似这样的东西时我没有收到任何错误:

@Override
public void onBackPressed() {

        if (getActionBar().getSelectedTab().getPosition()==1)**;**
        {
            if ( getFragmentManager().findFragmentByTag("Tag B") instanceof ContactsArchiveFragment)
            {
                    final ContactsArchiveFragment fragment = (ContactsArchiveFragment) getFragmentManager().findFragmentByTag("Tag B");

                if (fragment.allowBackPressed()) { // and then you define a method allowBackPressed with the logic to allow back pressed or not

                    Log.i("calls act back cont archive", "on back clicked");
                    super.onBackPressed();
                }
            }

        }

}

当我尝试做这样的事情时:

    @Override
public void onBackPressed() {

        if (getActionBar().getSelectedTab().getPosition()==1);
        {
            if ( getFragmentManager().findFragmentByTag("Tag B") instanceof ContactsArchiveFragment)
            {
                    final ContactsArchiveFragment fragment = (ContactsArchiveFragment) getFragmentManager().findFragmentByTag("Tag B");

                if (fragment.allowBackPressed()) { // and then you define a method allowBackPressed with the logic to allow back pressed or not

                    Log.i("calls act back cont archive", "on back clicked");
                    super.onBackPressed();
                }
            }

        }
        else
        {

        }

}

我收到了Syntax error on token "else", delete this token。当我看到半成品时,我意识到问题出在哪里。但这让我很奇怪,有人能解释一下它是什么意思吗?

【问题讨论】:

  • @Answers:我相信他在问为什么**;** 没有给他编译错误(显然)。

标签: java android if-statement syntax


【解决方案1】:

但这让我很奇怪,有人能解释一下它是什么意思吗?

当然 - ; 只是一个空语句,可以有一个没有 if 的块。例如,这是有效的:

if (i == 0)
    System.out.println("i was 0");

System.out.println("In top-level block");

{
    System.out.println("In a block");
}

...if 后面的分号仅相当于第一个带有空正文的 if 语句。

我个人总是if 语句(和while 语句等)使用大括号。如果您使用这样的空语句,某些编译器(例如 Eclipse 内置的编译器)允许您触发警告或错误。

else 表单无效,因为您只能将else 子句作为if/else 语句的一部分,而if 语句在末尾已经“完成”分号。

【讨论】:

    【解决方案2】:

    当您只有这样的 if 时:

    if();
    {
        // Supposed to be with if
    }
    

    应该与if 在一起的块现在只是一个独立于if 的本地块。 if 语句以分号结束。编译器不会将其标记为错误,因为它是完全有效的代码。

    现在是你的第二个案例:

    if ();
    {
    
    } else {
    
    }
    

    请注意,if 语句仅以分号结束,然后您有一个块。但是else 不会在任何if 之后出现,因为它必须出现。所以,它实际上是一个没有ifelse

    这类似于您将在此代码中收到错误的情况:

    if () {
    
    } 
    System.out.println("Hello");
    else {  // Error. Which `if` block do you suppose else to be bound with?
    
    }
    

    只是,上面的案例乍一看还是很明显的。所以它是这样的:

    if (); 
    

    可视化为:

    if()
        ;  // Empty statement
    

    相当于一个空的 if 块 - if() { }

    【讨论】:

      【解决方案3】:

      一个额外的; 造成了这里的所有混乱。

      那个分号在那里终止statement,并假设它是一个从那里开始的新块。

      如果你仔细观察

        if (getActionBar().getSelectedTab().getPosition()==1);  <----
      

      这是一个语句,不是一个 If 条件。

      条件应该是

       if (getActionBar().getSelectedTab().getPosition()==1){
      
      
      }
      

      删除多余的;

      如果您看到与块相关的docs

      块是一组在平衡大括号之间的零个或多个语句,可以在任何允许使用单个语句的地方使用。以下示例 BlockDemo 说明了块的使用:

      class BlockDemo {
           public static void main(String[] args) {
                boolean condition = true;
                if (condition) { // begin block 1
                     System.out.println("Condition is true.");
                } // end block one
                else { // begin block 2
                     System.out.println("Condition is false.");
                } // end block 2
           }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-15
        • 1970-01-01
        • 1970-01-01
        • 2018-11-12
        • 2020-12-16
        • 1970-01-01
        • 2021-06-20
        相关资源
        最近更新 更多