1

我看到了奇怪的情况:在我的 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。当我看到半成品时,我意识到问题出在哪里。但这让我很奇怪,有人可以解释它是什么吗?

4

3 回答 3

7

但这让我很奇怪,有人可以解释它是什么吗?

当然 - the;只是一个空语句,有一个没有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语句在分号末尾已经“完成”。

于 2013-09-18T15:46:21.570 回答
4

当你有if这样的:

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

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

现在有了你的第二个案例:

if ();
{

} else {

}

请注意,该if语句仅以分号结束,然后您有一个块。但是,else它并没有紧随其后if,因为它必须要来。所以,它真的是一个else没有一个if

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

if () {

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

}

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

if (); 

可以可视化为:

if()
    ;  // Empty statement

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

于 2013-09-18T15:46:31.157 回答
1

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

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

如果你仔细观察

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

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

条件应该是

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


}

删除多余的;

如果您看到 与块相关的文档,

块是一组位于平衡大括号之间的零个或多个语句,可以在任何允许使用单个语句的地方使用。以下示例 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
     }
}
于 2013-09-18T15:45:50.537 回答