1、异常概念
在程序执行过程中发生不正常情况称之为“异常”。
执行过程中发生的异常可分为两大类:
1)Error(错误):java虚拟机无法解决的严重问题,Error是严重的错误,会导致程序的崩溃。
2)Exception:其他因编写程序错误或者偶然的外在因素导致的一些问题,可以使用针对性代码进行处理。
Exception异常分为两大类,运行时异常和编译时异常。
运行时异常指的是在程序运行时发生的异常,编译时异常是指在编程的时候,编译器检查出来的异常。
2、异常体系图(重难点)
1)异常分为两大类,运行时异常和编译时异常;
2)运行时异常,编译器检测不出来,编译器不要求强制处置的异常,一般指的是编程时的逻辑错误
3)对于运行时异常,可以不做处理,因为这类异常很普遍,若全处理可能会导致程序的可读性以及运行效率产生影响。
4)编译时异常,是编译器要求必须处置的异常。
5)受检的异常是由编译器强制执行
的,必须捕获,用于指示不受程序控制的异常情况(例如,I/O 错误),而非受检的异常在运行时发生,用于指示编程错误
(例如,空指针。正因为如此,受检异常在使用的时候需要比非受检异常更多的代码来避免编译错误。
3、常见异常
常见运行时异常
1)NullPointerException空指针异常
当应用程序在需要对象的地方使用null时,抛出该异常
2)ArithmeticException数学运算异常
出现异常的运算条件时,抛出该异常。例如分母是0,。
3)Arrayindexoutofboundsexception数组下标越界异常
用非法索引访问数组的时候抛出异常,例如:索引为负数或者大叔等于数组实际长度。
4)ClassCastException类型转换异常
当试图将对象强制转换为不是实例的子类,抛出该异常
5)NumberFormatException数字格式不正确异常
当应用程序试图将字符串转换成为一种数值类型,但该字符串不能转换为适当格式的时候,抛出该异常。
编译时异常
4、异常处理概念
当异常发生的时候,对异常的处理方式
5、异常处理分类
异常处理方式
1)try-catch-finally
在代码中捕获异常,自行处理
2)throws
将发生的异常抛出,交给调用的方法来处理,调用的方法 可以使用try-catch-finally来处理,也可以再抛给上一级调用方法来处理,最后抛给jvm,由jvm来处理,最顶级的处理者就是jvm
throws和try-catch-finally二者二选一使用。
如果 没有显式处理异常,默认使用throws Exception。
try-catch方式处理异常
1)如果异常发生,则异常发生后面的代码不会执行,直接进入到catch块,
2)如果异常没有发生,则程序执行try代码块,不会进入到catch;
3)如果希望不管异常发生与否,都希望某行代码块执行,那么使用finally代码块。
4)可以有多个catch语句,捕获不同的异常,子类异常在前,父类异常在后
try-catch-finally小结
1)如果没有抛出异常,那么执行try块中的所有语句,不执行catch块中的语句,如果有finally,最后必须执行finally,
2)如果出现异常,则try块中异常发生后,try块剩下的语句不再执行,将执行catch块中的语句,如果最后有finally,还需要执行finally里面的语句。
3)如果只有try-finally,try中发生异常,程序崩溃,但是finally块中的语句正常执行。
throws异常处理:
1)如果一个方法可能生成某种异常,但不确定如果处理这种异常,则该方法应该应该显式声明抛出该异常,表明该方法将不对这些异常进行处理,而是由方法的调用者负责处理。
2)在方法的声明中用throws语句可以声明抛出异常的列表,throws后面的异常类型可以是方法中产生的异常类型,也可以是它的父类。
3)throws关键字后面也可以是异常列表,同时抛出多个异常。
throws异常处理注意事项:
1)对于编译异常,程序中必须显式处理
2)对于运行时异常,程序中如果没有处理默认就是throws的方式处理。
3)子类重写父类的方法时,对抛出的异常,要么父类和子类所抛出异常一致,要么子类抛出的异常就是父类抛出异常的子类
6、自定义异常
程序中出现了某些错误,但是该错误信息并没有在throwable子类中进行描述处理,那么我们可以自定义设计异常类,用于描述该错误信息。
步骤:
1)定义类:自定义异常 类名继承exception和runtimeException
2)如果继承Exception,属于编译异常。
3)如果继承RuntimeException则属于运行异常