日期:2014-05-20  浏览次数:20922 次

if后面加不加括号的问题
Java code
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

------解决方案--------------------
if ()
后面不使用花括号时,里面不能出现声明,因为那个涉及到作用域,而没有花括号又没有作用域了。

个人理解。

boolean ok = true;
if(ok)
MyClass c = new MyClass();

这样也是不允许的。
改成

MyClass c = null;
if(ok)
c = new MyClass();
这样是可以的

这个代码问题和 instanceof 没有任何关系

http://www.java2000.net/p8891
------解决方案--------------------
探讨
如果解释为编译器把声明看作是两条语句;
这解释我们还是能理解的
可这怎么可能呢
明明就只写了一条语句;
而且我记得老师和书上还特别强调每一个分号是一条语句;

难道那些都错啦吗
我到底该听谁的?

------解决方案--------------------
try {
Object o = c.newInstance();

if (o instanceof TestPrintStream1)
{
TestPrintStream1 tt = (TestPrintStream1) o;
}
}这样很明确,tt的作用域在if(){}的{}内({}是块作用域的标志)所以程序没有问题,而:
try {
Object o = c.newInstance();

if (o instanceof TestPrintStream1)
TestPrintStream1 tt = (TestPrintStream1) o;
}编译器在编译这段代码时,当编译到TestPrintStream1 tt = (TestPrintStream1) o;时,会确定tt的作用域是在try{}的{}中。这明确几点,编译器在编译if语句时,并不对if语句表达式的对错作出判断,程序在执行时才对if语句表达式的对错做判断。还有就是编译器编译代码是顺序编译的。(这都是编译原理中的知识,这里要用到这些知识来解决这个问题)当编译器编译TestPrintStream1 tt = (TestPrintStream1) o;时,编译器不能确定是否会生成tt对象(因为if语句表达式的对错没有确定)并且编译器不能确定这句后是否会用到tt对象。这样就有可能出现:tt对象没有生成(if表达式错),而在TestPrintStream1 tt = (TestPrintStream1) o;的后面又要用到tt对象,这样程序会出错,也可能出现其他其他三种情况。但这已经不重要了,因为有了这种情况,tt的定义已经出现了歧义,所以编译器无法编译。这有很多解决方法。

如果有谁还不清楚请联系我。 QQ:285743664