您的位置 首页 java

java学习笔记9——异常处理

如果有写的不对的地方,欢迎评论指正,相互学习相互进步,谢谢!

java 编程中,有一个特殊的机制叫做异常处理,这里进行一下总结。

这里不知道为什么这一篇一直审核不通过,所以拖欠了几天,这里在博客上发了,大家可以看看。

一、什么是java异常

java的异常有很多,异常就是指程序运行过程中出现的错误,会导致程序崩溃无法运行的问题。

如下图所示:

可以看到,java中所有的错误异常都是Throwable的一个子类实例,这个分为 Exception 和error,下面又有子类实例,最后一列只是列举了部分异常。这里简单介绍一下:

error(错误):error表示程序无法处理的错误,一般指java虚拟机相关的问题,如系统崩溃、虚拟机出错误、动态链接失败等,这些错误都是程序无法捕获的,也无法处理,所以当遇到这种问题时,无法再程序当中进行解决,需要另外处理

exception(异常)是指程序本身可以处理的异常,这种异常主要分为两大类:运行时异常和非运行时异常。

这里两者的区别主要是,异常是可以捕获并进行处理的,而错误是无法进行处理的。

在这里引入一个可查异常(checked exceptions)和不可查异常(unchecked exceptions)

可查异常: 在程序运行当中会出现的,并且在一定程度上可以预计,当这种情况发生时,就必须采取措施进行处理,除了RuntimeException及其子类以外,其他的Exception类及其子类都属于可查异常。这种异常的特点是Java编译器会检查它,也就是说,当程序中可能出现这类异常,要么用try-catch语句捕获它,要么用 throws 子句声明抛出它,否则编译不会通过。

不可查异常: 就是编译器不要求强制处理的异常,在这里主要包括运行时异常和(RuntimeException)和error。

可查和不可查是通过在书写时是否必须捕获处理来划分的。可查异常在代码的书写的时候必须进行捕获处理,而不可查则不用。

同时,exception这种异常也分为两大类,运行时异常和非运行时异常(编译异常)。程序中应该尽量去处理这种异常,不然程序可能会出错。

运行时异常: 该类异常都是RuntimeException类和其子类的异常,如NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等。这些是不检查异常,程序中可以进行捕获处理,也可以不进行捕获处理,不捕获的话就有可能在运行过程中出现错误。在 程序开发 过程中,应该尽量考虑全面,避免这种运行时异常。

非运行时异常(编译异常): 是RuntimeException以外的异常,类型上都属于Exception类及其子类。在编写代码的时候,这些都是必须进行捕获处理的。在这里,如果大家使用eclipse这种 IDE 进行程序代码编写的话,在写代码的时候如果不进行编译异常处理,那么IDE上就会出现错误,让你进行处理。

大家请看上图,编译器会主动报错,这里会说:Unhandled exception type FileNotFoundException,并提供两个解决方法。这就是编译异常。

二、异常的处理机制。

关键字:try,catch,finally,throw,throws。

异常的处理主要有两种方法:异常捕获和抛出异常。这里一个个说明。

1、捕获异常

格式:

捕获异常通常使用的是上述的代码,try……catch……finally……,其中,finally并不是必须的。这里执行的顺序是:

try中进行代码的执行,当执行过程中出现异常,catch进行捕获,然后运行catch中的代码,如果有finally,那就接着执行finally中的代码,没有则继续接下来的。这里需要区别于final,大家注意!

如下代码:

结果:

那么,如果没有try呢:

如图,运行到异常的时候就报错了,并且不会再继续往下运行。所以,在程序中对异常的处理是多重要,不然程序就宕机了!

这里有一个问题,如果catch或者try里面有return,finally还会运行么?

答案是 。大家有兴趣可以自己去研究研究。

finally关键字保证无论程序使用任何方式离开try块,finally中的语句都会被执行。在以下三种情况下会进入finally块:

  • try块中的代码正常执行完毕。

  • 在try块中抛出异常。

  • 在try块中执行return、 break 、continue。

2、抛出异常

这里有两个关键字,throws和throw。

这两个都是抛出来,就是一层层的往上抛出异常,在现阶段不进行这个异常的处理,交给调用这个方法的地方去处理这个异常。如下代码:

运行结果:

大家请看,如果b是作为除数的,那肯定是不行的,那就在前面加了一个if判断,如果是0,throw一个异常Exception。在 test ()这里进行 throws Exception 操作,交给调用test()的main方法进行处理,这里main里面用try……catch……进行捕获处理。

以上就是两种程序对于异常的处理。这里的throw是一种自定义异常,就是自己去设定一些程序中的异常。

二、常见的异常

1. runtimeException子类:

  • java.lang.ArrayIndexOutOfBoundsException

    数组索引越界异常。当对数组的索引值为负数或大于等于数组大小时抛出。

  • java.lang.ArithmeticException

    算术条件异常。譬如:整数除零等。

  • java.lang.NullPointerException

    空指针异常。当应用试图在要求使用对象的地方使用了null时,抛出该异常。譬如:调用null对象的实例方法、访问null对象的属性、计算null对象的长度、使用throw语句抛出null等等

  • java.lang.ClassNotFoundException

    找不到类异常。当应用试图根据 字符串 形式的类名构造类,而在遍历CLASSPAH之后找不到对应名称的class文件时,抛出该异常。

  • java.lang.NegativeArraySizeException 数组长度为负异常

  • java.lang.ArrayStoreException 数组中包含不兼容的值抛出的异常

  • java.lang.SecurityException 安全性异常

  • java.lang.IllegalArgumentException 非法参数异常

2.IOException

  • IOException:操作输入流和输出流时可能出现的异常。

  • EOFException 文件已结束异常

  • FileNotFoundException 文件未找到异常

3. 其他

  • ClassCastException 类型转换异常类

  • ArrayStoreException 数组中包含不兼容的值抛出的异常

  • SQLException 操作数据库异常类

  • NoSuchFieldException 字段未找到异常

  • NoSuchMethodException 方法未找到抛出的异常

  • NumberFormatException 字符串转换为数字抛出的异常

  • StringIndexOutOfBoundsException 字符串索引超出范围抛出的异常

  • IllegalAccessException 不允许访问某类异常

  • InstantiationException 当应用程序试图使用Class类中的newInstance()方法创建一个类的实例,而指定的类对象无法被实例化时,抛出该异常

三、异常处理的一些原则:

  1. 能处理就早处理,抛出不去还不能处理的就想法消化掉或者转换为RuntimeException处理。因为对于一个应用系统来说,抛出大量异常是有问题的,应该从程序开发角度尽可能的控制异常发生的可能。

  2. 对于检查异常,如果不能行之有效的处理,还不如转换为RuntimeException抛出。 这样也让上层的代码有选择的余地――可处理也可不处理。

  3. 对于一个应用系统来说,应该有自己的一套异常处理框架,这样当异常发生时,也能得到统一的处理风格,将优雅的异常信息反馈给用户。

四、最后说一句

java的异常机制还是很重要的,因为在开发中不可避免的肯定会遇到。作为程序猿在开发中,不仅要考虑到逻辑,还需要考虑问题的全面性,会发生什么样的情况。任重而道远啊,加油!

文章来源:智云一二三科技

文章标题:java学习笔记9——异常处理

文章地址:https://www.zhihuclub.com/174590.shtml

关于作者: 智云科技

热门文章

网站地图