空指针常量

       用VB.NET 敲三层的时候,遇到了一个素未相识的错误:

       变量“DB”在赋值前被使用,可能会在运行时导致null引用异常

源自:

<span style="font-family:FangSong_GB2312;font-size:18px;"> Dim DB As  LoginModel.Dbutil 
 Using conn As New SqlConnection(DB.ConnString)</span>
这是数据访问层中ScoreDAO类中的代码,在UserDAO类中也有类似的代码:

<span style="font-family:FangSong_GB2312;font-size:18px;">Dim db As New LoginModel.Dbutil
Using Conn As New SqlConnection(db.ConnString)</span>
而且我把上面的这段代码复制到ScoreDAO中系统就不再提示该错误了;

Ctrl+F查找  该解决方案下所有的“DB”,也没有发现它有被使用过的痕迹,这是怎么回事?上网查吧

很快就找到了答案:

空指针常量_第1张图片

在这个回答的评论里有人说:把 dim dr As SqlDataReader 改为 dim dr as New SqlDataReader,亲测可用,这样问题解决了,但是为这是什么问题呢?文章被标题给出了答案:空指针常量。

   指针:   

   了解空指针之前先说说什么是指针吧。在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值指向存在存储器中另一个地方的值,即地址指向所需的变量单元将地址形象化的称为"指针";个人理解:指针起着一个“指引”的作用;不同的领域对指针也有着不同的定义,详解


指针可以用来有效地表示复杂的数据结构,可以用于函数参数传递并达到更加灵活使用函数的目的.使C语言程序的设计灵活、实用、高效;指针不仅仅是C语言的灵魂,运用得好更是事半功倍,让你写出的程序更简洁。

指针的值不能是整型值,但空指针是个例外,他的值可以是一个纯粹的零(并不必须是纯粹的零,但这个值是唯一有用的值。在编译时产生的任意一个表达式,只要它是零,就可以作为空指针的值,在程序运行时,最好不要出现一个为零的整型变量)。 

空指针:

它并不指向任何对象,空指针的值是NULL,NULL是一个纯粹的零,它可能会被强制转换成void*或char*类型。即NULL可能是0,0L或(void*)0等。有些程序员,尤其是C++程序员,更喜欢用0来代替NULL;而在一般的文档中倾向于用 NULL 表示,而没有直接说成 0。但是对于指针类型来说,返回 NULL 和 返回 0 是完全等价的,因为 NULL 和 0 都表示 "null pointer"(空指针)。一句话, 空指针就是一个被赋值为0的指针,在没有被具体初始化之前,其值为0.

NULL在C和C++的定义方式也不一样,甚至不同的编译器也有不同的要求,如:

define NULL 0 //C的定义方式 
define NULL (void *)0 //C++的定义方式

http://xyz64happy.blog.163.com/blog/static/9863967720081027838071/

网页问答上说这个空指针常量还关涉到自动装箱、自动拆箱这部分内容,本菜鸟表示不懂,但是先介绍一下再说:

自动拆装箱:

自动装箱:


   基本数据类型封装为对象类型。当我们创建一个Integer对象时,可以这样:Integer i = 100; (不是 int i = 100; )实际上执行该段代码的时候,系统为我们执行了:Integer i = Integer.valueOf(100);此即基本数据类型的自动装箱功能。基本数据类型不是对象,其没有可调用的方法。int t = 1;t.后面是没有方法的。Integer t =1; t.  后面就有很多方法可让你调用了。

自动拆箱(unboxing)


    也就是将对象中的基本数据从对象中自动取出int t = i; 实际上执行了 int t = i.intValue();
http://www.cnblogs.com/shenliang123/archive/2012/04/16/2451996.html

引用:

    对已说明的变量来说,变量名就是对变量值的直接引用。对指向变量或内存中的任何对象的指针来说,指针就是对对象值的间接引用。如果p是一个指针,p的值就是其对象的地址;*p表示“使间接引用运算符作用于p”,*p的值就是p所指向的对象的值。

不妥之处欢迎交流。共同进步。

你可能感兴趣的:(空指针常量)