科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道if后面加不加括号的问题

if后面加不加括号的问题

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

if后面加不加括号的问题

作者:csdn 来源:csdn 2009年12月17日

关键字: JavaSE 问答 java

  • 评论
  • 分享微博
  • 分享邮件

 if后面加不加括号的问题

Java codepublic class TestPrintStream1 {

  public static void main(String[] args) {

    Class c = TestPrintStream1.class;
    try {
      Object o = c.newInstance();
     
      if (o instanceof TestPrintStream1)
        TestPrintStream1 tt = (TestPrintStream1) o;// 这里为什么会报错呢,说tt 和 TestPrintStream1不能不解析
    } catch (InstantiationException e) {

      e.printStackTrace();
    } catch (IllegalAccessException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }

  }
}

 

 

if ()
后面不使用花括号时,里面不能出现声明,因为那个涉及到作用域,而没有花括号又没有作用域了。
个人理解。
boolean ok = true;
if(ok)
  MyClass c = new MyClass();
这样也是不允许的。
改成
MyClass c = null;
if(ok)
  c = new MyClass();
这样是可以的
这个代码问题和 instanceof 没有任何关系

 

你声明变量的时候,应该确认你这个变量的作用域,很显示这行语句的作用域取决于上边的IF语句,但是你却没有规定IF语句的作用域,也就是{},你把IF语句删掉了,很显然,他的作用域变成了TRY{},所以你是删还是加都是对的,不过这种错还是你写作习惯不好,你要是IF语句作用域范围内不管有几行代码,你都加上{}就不会出现这种问题了

 

Java Language Specification 明确指出局部变量声明的作用范围是在一个
块内,也可以理解为在“{  }”内。for 循环可以不使用“{ }”的,但仅限于
执行语句(其中并不包括变量声明语句)

我们看到的代码是这样的:

Java code
01 public class TestPrintStream1 { 02 03 public static void main(String[] args) { 04 05 Class c = TestPrintStream1.class; 06 try { 07 Object o = c.newInstance(); 08 if (o instanceof TestPrintStream1) 09 TestPrintStream1 tt = (TestPrintStream1) o; 10 } catch (InstantiationException e) { 11 e.printStackTrace(); 12 } catch (IllegalAccessException e) { 13 e.printStackTrace(); 14 } 15 } 16 }



由于变量作用域的关系,编译器所看到的代码是这样的,注意 09 行的缩进!

Java code
01 public class TestPrintStream1 { 02 03 public static void main(String[] args) { 04 05 Class c = TestPrintStream1.class; 06 try { 07 Object o = c.newInstance(); 08 if (o instanceof TestPrintStream1) 09 TestPrintStream1 tt = (TestPrintStream1) o; 10 } catch (InstantiationException e) { 11 e.printStackTrace(); 12 } catch (IllegalAccessException e) { 13 e.printStackTrace(); 14 } 15 } 16 }

从 08 和 09 行编译器所理解的代码中来看,很明显 08 行的 if 语句并没有
结束,因此编译器会认为 if 后面少掉一个语句结束的分号。
笨笨地编译器猜想你的代码应该是这样的,注意 08 行后面的分号
Java code

08 if (o instanceof TestPrintStream1); 09 TestPrintStream1 tt = (TestPrintStream1) o;

实际上编译器的这种理解并不是我们想要的。
为了不出现我们所不知的东西来困扰,应该老老实实地在 for, if, while 等语句后面加
上 {  },哪怕块中的语句只有一行。

 


public class Test {

public static void main(String []args)
{
Class test=Test.class;
try {
      Object o = test.newInstance();
     
      if (o instanceof Test)
        boolean bool=false;// 这里一样会报错,说boolean和 bool不能不解析
    } catch (InstantiationException e) {

      e.printStackTrace();
    } catch (IllegalAccessException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }

}
}


 

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章