用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”,也没有发现它有被使用过的痕迹,这是怎么回事?上网查吧
很快就找到了答案:
在这个回答的评论里有人说:把 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/
网页问答上说这个空指针常量还关涉到自动装箱、自动拆箱这部分内容,本菜鸟表示不懂,但是先介绍一下再说:
对已说明的变量来说,变量名就是对变量值的直接引用。对指向变量或内存中的任何对象的指针来说,指针就是对对象值的间接引用。如果p是一个指针,p的值就是其对象的地址;*p表示“使间接引用运算符作用于p”,*p的值就是p所指向的对象的值。
不妥之处欢迎交流。共同进步。