专栏首页极客慕白的成长之路Java常见异常类型及原因分析

Java常见异常类型及原因分析

0x1 NullPointerException异常

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

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

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

例如下面的代码:

String str = "这是测试用的字符串!";
System.out.println(str.length());
String str1 = null;
System.out.println(str1.length());
//产生 NullPointerException异常

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

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

 People p = null;
 p.setName("mubai");
 System.out.println(p.getName());

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

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

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

if (str!=null) {
        System.out.println(str.length());
}else{
        System.out.println(0);
}

0x2 ClassCastException异常

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

Animal a1 = new Dog();
Animal a2 = new Cat();
Dog d1 = (Dog)a1;
Dog d2 = (Dog)a2;  //ClassCastException异常

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

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

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

  • 通过o.getClass().getName()得到具体的类型,可以通过输出语句输出这个类型,然后根据类型进行进行具体的处理。
  • 通过if(o.instanceof 类型)的语句来判断o的类型是什么。

0x3 ArrayIndexOutOfBoundsException异常

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

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

0x4 UnsupportedClassVersionError

错误提示如下: java.lang.UnsupportedClassVersonrrorr Bad version number in .class file 错误原因: 编译 Java 和运行 Java 所使用的 Java 的版本不一致。例如,编译的时候使用的 Java 版 本是 6,运行时候使用的 Java 版本是 5。 解决方案: 修改运行环境的 Java 版本或者修改编译环境的 Java 版本,让两者保持一致。

0x5 NumberFormatException异常

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

0x6 堆栈溢出和内存溢出

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

0x7 常见的异常类

异常

说明

RuntimeException

Java.lang 包中多数异常的基类

ArithmeticException

算术错误,如除以 0

IllegalArgumentException

方法收到非法参数

SecurityException

试图违反安全性

ClassNotFoundException

不能加载请求的类

AWTException

AWT 中的异常

IOException

I/O 异常的根类

FileNotFoundException

不能找到文件

EOFException

文件结束

IllegalAccessException

对类的访问被拒绝

NoSuchMethodException

请求的方法不存在

InterruptedException

线程中断

除特别注明外,本站所有文章均为慕白博客原创,转载请注明出处来自https://geekmubai.com/programming/828.html

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 使用Vagrant和Virtual Box搭建虚拟开发环境

    慕白
  • 迅雷资源助手(TSearch) – 种子搜索神器

    迅雷资源助手迅雷资源助手 是一款搜索下载资源的 p2p 种子搜索器,绿色软件,可以进行磁力搜索,电驴搜索,种子搜索,网盘搜索,搜索质量远高于 p2psearch...

    慕白
  • 信息安全实验室招新试题和完全解析

    写个网页应该是很简单的,不管是静态网页还是带特效的网页。但是有几个问题,需要说明一下。

    慕白
  • 神经网络架构搜索——可微分搜索(P-DARTS)

    如上图所示,在DARTS中,搜索时候是以 8 cells with 50 epochs 来进行的,而evaluate时却以 20 cells,这bias造成了精...

    AI异构
  • 如何构建高效自动化的企业私有云?

      Amazon Web Services、Google、Rackspace与Microsoft所提供的云服务不尽相同,但有一点共识:近乎疯狂的专注于自动化,以...

    静一
  • WindowsMobile/Win Form-界面自适应

    起因     使用SmartPhone上的WinForm做了一个WM的小程序,结果放到手机上实际一运行。发现动态生成的控件在里面显示得都非常小,难以看清。 原因...

    用户1172223
  • 单项环形链表

    设编号为1,2,3,...n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m的那个人出列,他的下一位又从1开始报数,数到m的那个人又出列...

    uglyboy
  • 神探Sherlock如何用AI破案?教你在Excel中搭建一个人脸识别CNN网络

    【导读】人脸识别技术已经有了非常广泛的应用,国内大规模监控系统背后运用的技术就是人脸识别。

    AI科技大本营
  • 我们的峰会IP堪比佩奇,信不信?

    ? 这几天,“啥是佩奇”火遍了大江南北,而游云南【云来·共生】智慧文旅峰会的大咖IP也配齐喽,一起看看吧~~~ ? 2019年1月22日,“游云南”智慧文旅峰...

    腾讯文旅
  • 我是如何走上JVM这条贼船的?

    寒泉子:阿里jvm专家,主要围绕jvm发表系列文章,现有个人微信公众号:“你假笨”(ID:lovestblog)

    养码场

扫码关注云+社区

领取腾讯云代金券