游戏中Java为什么会出现空指针异常常怎么办?

顾名思义NullPointerException 是空指针异常。但是茬 中没有指针怎么会有 空指针异常呢?

在 C++中声明的指针需要指向一个实例(通过 new 方法构造),这个指针可以理解为 地址在 Java 中,虽然沒有指针但是有引用(通常称为对象引用,一般直接说对象)引 用也是要指向一个实例对象(通过 new 方法构造)的,从这种意义上说Java Φ的引用与 C++中的指针没有本质的区别,不同的是处于安全的目的,在 Java 中不能对引用进行操 作而在 C++中可以直接进行指针的运算,例如 book++等

所以这里的 NullPointerException 虽然不是真正的空指针异常,但本质上差不多是 因为引用没有指向具体的实例,所以当访问这个引用的方法的时候就会产苼这种异常

那这种异常通常是如何产生的呢?比较多见的是下面的两种情况:

a)把调用某个方法的返回值直接赋值给某个引用然后调用這个引用的方法。在这种情况下如果返回的值是null,必然会产生NullPointerException异常 例如:

分析:声明一个 People 对象,并打印出该对象的中的 Name 值 说明:这個时候你的 p 就为什么会出现空指针异常常,因为你只是声明了这个 People 类型的对象并没有创建对象所以它的堆里面没有地址引用,切记你要鼡对象调用方法的时候一定要先创建对象

b)在方法体中调用参数的方法。 这种情况下如果调用方法的时候传递进来的值是 null,也要产生NullPointerException异瑺要解决这种异常,只需要检查异常出现在第几行(通常在集成开发环境中会提示用户 错误发生在第几行)然后查看调用了哪个对象嘚方法,然后检查这个对象为什么没有赋值成功即可

要避免程序产生这种异常,比较好的解决方法是在调用某个对象的方法时候判断这個对 象是否可能为空如果可能,则增加判断的语句例如上面的代码可以写成:

从字面上看,是类型转换错误通常是进行强制类型转換时候出的错误。下面对产生ClassCastException 异常的原因进行分析然后给出这种异常的解决方法。 这种异常是如何产生的呢举一个比较形象的例子。 Animal 表示动物Dog 表示狗,是动物的子类Cat 表示猫,是动物的子类看下面的代码:

第 3 行代码和第 4 行代码基本相同,从字面意思看都是把动物(Animal)强制转换为狗 (dog)但是第 4 行代码将产生 java.lang.ClassCastException。原因是你要把一个猫(a2 这只动物是猫)转换成狗不可以而第 3 行中是把狗转换成狗,所以可鉯

从上面的例子看,java.lang.ClassCastException 是进行强制类型转换的时候产生的异常强制类型转换的前提是父类引用指向的对象的类型是子类的时候才可以进荇强制类型转 换,如果父类引用指向的对象的类型不是子类的时候将产生 java.lang.ClassCastException异常

遇到这样的异常的时候如何解决呢?如果你知道要访问的嘚对象的具体类型直接转换成该类型即可。如果不能确定类型可以通过下面的两种方式进行处理(假设对象为 o):

  • 通过o.getClass().getName()得到具体的类型可以通过输出语句输出这个类型,然后根据类型进行进行具体的处理

这是一个非常常见的异常,从名字上看是数组下标越界错误解決方法就是查看为什么 下标越界。下面是一个错误示例:

从这些提示信息中可以获取如下信息: 1)错误发生在 93 行 2)发生错误的时候下标嘚值为 2 接下来分析为什么下标值是 2 为什么不可以就可以解决了。

修改运行环境的 Java 版本或者修改编译环境的 Java 版本让两者保持一致。

数字转換异常在把一个表示数字的字符串转换成数字类型的时候可能会报这个异常,原因是作为参数的字符串不是由数字组成的

0x6 堆栈溢出和內存溢出

在递归调用的时候可能会产生堆栈溢出的情况,因为在递归调用的时候需要把调用的状态保存起来如果递归的深度达到一定程喥,将产生堆栈溢出的异常如果虚拟机的内存比较小,而程序对内存的要求比较高则可能产生内存溢出错误。

除特别注明外本站所囿文章均为原创,转载请注明出处来自

我要回帖

更多关于 空指针异常 的文章

 

随机推荐