A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© 创造命运 中级黑马   /  2014-4-9 10:19  /  1250 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 创造命运 于 2014-4-9 10:22 编辑

刚刚在回顾之前学过的内容时,碰到如下一个问题,请教各位大神。代码:
public class StaticTest05{
       static{
                System.out.println(i);
        }        
        static int i = 100;

}
在编译时报“非法向前引用”异常,改成如下代码后就好了。
public class StaticTest05{
       static int i = 100;
       static{
                System.out.println(i);
        }

}
在网上查了查,但还是不是很明白,截图如下:

问题:1.为什么会报该异常呢?
           2.这个异常是如何产生的,如何理解“非法向前”。
           3.通常什么情况下回报该异常。

2 个回复

倒序浏览
本帖最后由 苏伯亚 于 2014-4-9 10:57 编辑

非法向前引用 我的理解是在变量声明之前使用了它,c语言中这样做是正常的。但是java中不可以。static都知道是修饰静态变量。
内存总体一共分为了  4个部分(stack segment、heap segment、code segment、data segment)  当我们在程序中,声明一个局部变量的时候,此变量就存放在了 stack segment(栈)当中;  当new 一个对象的时候,此对象放在了heap segment(堆)当中;  而static 的变量或者字符串常量 则存在在 data segment(数据区)中;  那么类中方法的话,是存在在 code segment(代码区)中了。
所以你先
      static{
                System.out.println(i);
        }        
这样就先存在数据区。但是前面你并没有声明 i 而是在这个代码后面声明的 i
static int i = 100;
这样 i 的声明就比输出语句晚进入data segment(数据区)中,这样编译的时候自然就会报错。因为编译是从上到下。编译到输出语句时发现现在没有声明 i 而是在后面声明的。所以就报个了非法向前引用异常错误。
至于什么时候报这个异常,就是你这种调用情况吧。变量定义在方法中调用变量之后。才会报这个异常。
希望可以帮到你

回复 使用道具 举报
苏伯亚 发表于 2014-4-9 10:46
非法向前引用  我的理解是在变量声明之前使用了它,c语言中这样做是正常的。但是java中不可以。static都知道 ...

理解,非常非常感谢!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马