if后面加不加括号的问题

奇允 2008-08-25 06:43:04
加精
public 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();
}

}
}

我把上面的改一下 有两种可以成功:
1:把if那行语句去掉就行
2:在if后面加上话括号也行
我解释不了第二种为什么就行
我qq775126386
...全文
4988 172 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
172 条回复
切换为时间正序
请发表友善的回复…
发表回复
lodachi 2009-09-27
  • 打赏
  • 举报
回复
穿军装的那个大哥给的解释是“拆成俩句了”,

我不明的是,编译器为什么要把它拆成两句?

我是个新手,不过觉得“拆成俩句了”这个解释有点牵强。
hudielei45 2009-08-03
  • 打赏
  • 举报
回复
你们说地俺啥时候也可以懂唉 我什么时候也是高手呢
hudielei45 2009-08-03
  • 打赏
  • 举报
回复
唵還媞接著囬呿恏恏學習吧 砹
XF168 2009-06-25
  • 打赏
  • 举报
回复
[Quote=引用 168 楼 XF168 的回复:]
if (o instanceof TestPrintStream1)
TestPrintStream1 tt = (TestPrintStream1) o;
的时候,TestPrintStream1 tt 想成为if的作用域的。
[/Quote]
应该说是if(o instanceof TestPrintStream1)语句没有结束,…if(o instanceof TestPrintStream1);…能通过编译说明了这个问题,它(编译器)要继续对if语句编译下去,当编译到TestPrintStream1 tt时,它发现tt想成为if的作用域,与tt是try{}作用域相矛盾。故编译不了。

另外,大家可以 //TestPrintStream1 tt = (TestPrintStream1) o;
发现if(o instanceof TestPrintStream1)语句确实没有结束
if(o instanceof TestPrintStream1)后面的都因if而出错。
XF168 2009-06-25
  • 打赏
  • 举报
回复
public 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();
}

}
}
我就以上的问题做个总结,如有不对的地方请大家指正:
1.编译器在编译这段代码时,当编译到TestPrintStream1 tt = (TestPrintStream1) o;时,会确定tt的作用域是在try{}的{}中。这点确实是这样的,{}说明了问题。
2.现在,看看楼上做过的实验
1if (o instanceof TestPrintStream1);这样编译通过
2 //if (o instanceof TestPrintStream1)这样也通过编译
这个说明在编译
if (o instanceof TestPrintStream1)
TestPrintStream1 tt = (TestPrintStream1) o;
的时候,TestPrintStream1 tt 想成为if的作用域的。但按照编译是顺序编译的,刚才tt已经属于try{}的
作用域,与现在又想成为if作用域相矛盾。故无法通过编译。

这点跟97楼的吻合,但并不是98楼的那种添加{}的想法,
也绝非TestPrintStream1 tt;tt = (TestPrintStream1) o;

以上仅代表个人观点,仅对问题发表个人想法。
aslanwu 2009-06-18
  • 打赏
  • 举报
回复
学习一下。
suihongri 2009-02-25
  • 打赏
  • 举报
回复
学习了,收益
heirenhua 2009-02-15
  • 打赏
  • 举报
回复
还没学到这部分的内容呢!继续加油了!
ningandjin 2009-02-13
  • 打赏
  • 举报
回复
学习了,支持编译成两句的观点
zhengpeiyong 2008-12-12
  • 打赏
  • 举报
回复
这个帖子不错,学到了很多,不过个人觉得这种问题接近于底层的代码解析了,而java本身就是以底层协议为基础,建立在底层之上的一种操作性语言,如果喜好研究底层这些编译原理的可以深入探讨下,至于学习Java的人,觉得知道了大概的问题和了解些原理即可,以后规范下编程习惯就可避免了。我也想学好多,把所有遇到的都弄懂,但人的精力有限,肯定不能把所有的东西融会贯通的,做自己该做的,把一些比较偏远且难以琢磨的问题留给那个领域的专研者来解答吧,这样至少能节省时间和精力,以在自己的领域达到更高的水平!
zlyymxl 2008-12-11
  • 打赏
  • 举报
回复
高手们的解答不错
zhangshoufeng 2008-10-21
  • 打赏
  • 举报
回复
路过!
qc40602848 2008-10-21
  • 打赏
  • 举报
回复
感谢20楼的回答。
kribo2008 2008-10-20
  • 打赏
  • 举报
回复
呵呵,,学习了不少啊。。
cdm0881 2008-10-19
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 dreamsky1989 的回复:]
你声明变量的时候,应该确认你这个变量的作用域,很显示这行语句的作用域取决于上边的IF语句,但是你却没有规定IF语句的作用域,也就是{},你把IF语句删掉了,很显然,他的作用域变成了TRY{},所以你是删还是加都是对的,不过这种错还是你写作习惯不好,你要是IF语句作用域范围内不管有几行代码,你都加上{}就不会出现这种问题了
[/Quote]

支持!
dellheng 2008-10-18
  • 打赏
  • 举报
回复
学习
hhb_snow1 2008-10-17
  • 打赏
  • 举报
回复
学习,我应该看看编译原理
buzaishimeng 2008-10-15
  • 打赏
  • 举报
回复
了解。。
fulton_xc 2008-09-04
  • 打赏
  • 举报
回复
学习。
if(true)
int i;

这个为什么报错?
是因为没{}提供作用域吗?
  • 打赏
  • 举报
回复
遇到过..
加载更多回复(150)

62,634

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧