namespace web
{
   public class web1
     {
        ....
        private void Page_Load(object sender, System.EventArgs e)
          {
              web2 xiao=null;
              xiao.method();
          }    
     }
   public class web2
     {
        public void method();
        ....
     }
}
上面这段c#代码,编译能通过,但运行抱错说xiao没有实例化。当然xiao的确是个空引用,但为什么编译能通过???运行时候才有错误???欢迎大家指教!

解决方案 »

  1.   

    web2 xiao=null;
    xiao=getWeb2(str);
    xiao.method();
    如果是这样,而且getWeb2()还要是读数据库,根据str参数来确定是否返回null还是web2的一个实例,你让编译器去确定.str要再去数据库中几百万条数据中,不同的数据返回不一样.即便是做出这样的编译器,编译时也要花很长时间来完成再说要有这样的编译器,把所有的错误都找出来了,就不用测试了
      

  2.   

    编译只对语法检查.
    如下例子:
    int i=int.Parse(txtA.Text.Trim());
    int b=100/i;
    它肯定能通过编译。
    但是在运行时,如果你在txtA文本框中输了的不是数字,第一行肯定会出错。如果输入的是0,第二行肯定会出错。
      

  3.   

    谢谢大家的回复!既然这样,那在编译的时候是如何找到method()这个方法而能够通过检测呢?
      

  4.   

    我是想知道编译的时候如何找到method()的,因为没有实例化,编译的时候对这个方法做了什么事情??
      

  5.   

    猜测,根据你调用该方法的类名定位改类所有方法,看该方法是否能被调用(public属性么?)
      

  6.   

    编译和执行所分配的任务不一样
    编译的任务:语义、文法等等方面的检查,你上面的例子在编译时不出错。
    执行的任务:对象、变量空间的分配等动作。你上面的 web2 xiao=null;根本就没有分配到空间
    当然也找不到对象方法的地址,所 xiao.method();所以在执行时会出错。