扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
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 循环可以不使用“{ }”的,但仅限于
执行语句(其中并不包括变量声明语句)
我们看到的代码是这样的:
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 行的缩进!
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领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者