Java学习分享-常见的异常类型

举报
发表于 2021/11/03 23:12:24 2021/11/03
【摘要】 在学习异常的时候,不免被各种各样的异常类型弄晕,本文主要是从具体的异常类型为出发点来进一步的对异常有一个更清晰的认识。如果能做到对各种常见异常心中有数,就能在写代码的时候有意识的避免一些逻辑上的错误,抛出异常的时候也能快速判断出为什么会出现异常,属于什么类型的异常,是否必须处理,如何改进代码来避免等。

在学习异常的时候,不免被各种各样的异常类型弄晕,本文主要是从具体的异常类型为出发点来进一步的对异常有一个更清晰的认识。如果能做到对各种常见异常心中有数,就能在写代码的时候有意识的避免一些逻辑上的错误,抛出异常的时候也能快速判断出为什么会出现异常,属于什么类型的异常,是否必须处理,如何改进代码来避免等。为对各种常见异常类型有一直观认识,下面是我自己整理的常见异常类型的一张图表供大家参考~

一、常见异常一览图

二、异常的分类

异常在Java中是以类的形式存在的。Throwable类是所有错误和异常的超类,Throwable有两个直接子类:一个是Error,一个是Exception,表示可抛出的。

Error:

Error类及其子类,表示程序在运行过程中出现了严重的错误,一般是和JVM相关的,而这些问题不应该再交给Java的异常处理机制来处理,程序会直接崩溃掉。Error类错误发生时,JVM一般会选择线程终止。按照Java的惯例,不应该实现任何的新的Error子类。

Exception:

Exception类及其子类,表示的是程序如果设计合理的话就不会发生的异常,即使发生,也是程序可以捕获并且处理的异常。Exception异常又可分为两大类:

编译时异常:Exception的直接子类,也就是除RuntimeException及其子类之外的Exception异常称为编译时异常。

  • 编译时异常并不是说程序发生在编译阶段,而是程序员必须在编写阶段就对这些程序进行处理,否则程序无法编译通过,因此也叫受检异常。
  • 从语法角度讲,编译时异常必须进行预先处理,要么上抛,要么捕获,否则不能通过编译!

运行时异常:RuntimeException及其子类称为运行时异常。运行时异常一般是由程序逻辑错误引起的,又称为不受检异常。

  • 从语法角度讲,Java编译器不会检查运行时异常,在程序中可以选择处理,也可以不处理,编译都会通过!但是当程序中可能出现此类异常时,应该从逻辑上改进并修改代码,尽量避免运行时异常的产生
  • 出现运行时异常,如果不对异常进行捕获处理,如果不想程序终止,就必须捕获所有的运行时异常。

三、常见的Exception子类型

运行时异常

1、ClassCastExceprion(类型转换异常)

ClassCastException通常出现在向下转型的操作中,当类型不兼容的情况下会抛出异常,比如

Animal a6 = new Bird();
Cat c = (Cat)a6;

分析:程序会编译通过,因为对编译器来说,Animal和Cat之间是存在继承关系的,是可以向下转型的,Cat c = (Cat)a6;没有语法错误,编译通过。但是在运行阶段,引用变量a6底层实际上对应的是一只Bird,Bird和Cat之间是不存在继承关系的,将Bird类型强转为Cat类型就会抛出ClassCastException

Exception in thread "main" java.lang.ClassCastException: Bird cannot be cast to Cat

为了避免此种异常的产生,建议在向下转型之前先用instanceof运算符进行类型判断

2、ArithmeticException(算术运算异常)

ArithmeticException异常最常见的情况就是运算表达式中除数为0

System.out.println(10/0);

Exception in thread "main" java.lang.ArithmeticException: / by zero

这是一种完全可以通过条件判断就能避免的异常情况,同数学运算一样,碰到除法运算最好对分母中的变量做运算之前先判断一下是否为0

3、IllegalArgumentException(不合法参数异常)

IllegalArgumentException异常表明向方法传递进了一个不合法或不正确的参数

4、IndexOutOfBoundsExcption(下标越界异常)

IndexOutOfBoundsExcption表示某种类型的索引(例如数组、字符串等)超出了范围。有两个子类ArrayIndexOutOfBoundsExceptionStringIndexOutOfBoundsException

ArrayIndexOutOfBoundsException抛出,表示数组的索引为负或大于或等于数组的大小。

StringIndexOutOfBoundsException抛出,表示索引为负或大于字符串的大小。

所以对数组或字符串按索引操作的时候,最好对下标进行是否越界的检查来避免此种异常的产生

5、NullPointerException(空指针异常)

NullPointerException表示试图在一个需要用引用变量的地方使用null时,会抛出空指针异常

String str=null;
System.out.println(str.equals("hello"));

Exception in thread "main" java.lang.NullPointerException,所以最好在调用某个对象的方法的时候先判断以下此对象是否为null

6、NumberFormatException(数字格式异常)

NumberFormatException通常出现在试图将一个String转换为指定的数字类型,而该字符串确不满足数字类型要求的格式时,抛出该异常.

Integer.parseInt("Hello123");

Exception in thread "main" java.lang.NumberFormatException: For input string: "Hello123",这表明"Hello123"不是一个可解析为数字的字符串

........

编译时异常

1、CloneNotSupportedException(克隆不支持异常)

Object中的克隆方法clone()被调用,来克隆对象,但该对象的类没有实现可克隆接口Cloneable时,就会抛出异常。要实现克隆,必须先实现Cloneable接口,并重写clone()方法来实现,否则就会抛出异常CloneNotSupportedException

2、SQLException

SQLException提供关于数据库访问错误类的信息

3、ClassNotFoundException(类找不到异常)

当动态加载class对象时找不到对应的类时抛出该异常,原因可能是要加载的类不存在或者类名写错了!

4、IOException

一般在读写数据的时候会出现此类异常,由失败或中断的I/O操作引起,常见的子类有EOFException、FileNotFoundException等

........

以上是对常见的异常类型一些简单的总结,在以后碰到新的异常类型的时候还是要多多完善,如有不当之处欢迎大家指正!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。