java异常处理
一、什么是异常处理
异常处理是基于面向对象的一种运行太错误处理机制,通过对异常问题的封装,实现对用户的非法操作、参数设置异常,硬件系统异常,网络状态改变异常等运行态中可能出现的异常信息的处理机制。
二、异常处理机制体系结构
Java将异常处理封装成一个个类,其中类与类之间的继承关系为:
在异常处理机制中,会对异常进行跟踪,当发生异常时,控制台一次显示,异常名称,提示消息(异常原因),产生异常的行号。对于一些可修复的程序,我么你可以选择抛出异常,java会自动的修改异常,让程序能正常运行
三、异常捕获
异常捕获的语法为try,catch,finally。程序首先执行try中的代码,当满足catch中的异常情况时执行catch中的代码,catch可以有多个,最后执行finally中的代码。
四、使用throws和throw抛出异常
这种方法是将异常抛出给JVM,而使用throw抛出异常是抛出一个对象,throw可以单独使用也可以和try,catch一起使用。
五、自定义异常
在我们自定义异常时,一定要是Throwable的子类,如果是检查异常就要继承自Exception,如果是运行异常就要继承自RuntimeException。
异常:异常是描述出错信息的对象。
异常的API结构:Throwable是父类,有两个子类Error和Exception。其中Error是错误,是崩溃级别的错误,
可以捕获,但无法处理。Exception是普通错误,可以捕获,可以处理
Error是所有错误 类的父类
Exeption是所有异常类的父类
try{
被保护的代码
}catch(NumberFormatException e){//创建异常变量e,接收try块抛出的异常对象
捕获块
e.printStacktrace();//创建异常变量
}
public static void main(String[] args) {
try {
String m= JOptionPane.showInputDialog(null,"请输入一个数");
int n=Integer.parseInt(m);
JOptionPane.showMessageDialog(null, n*n);
}catch(RuntimeException e) {//创建异常变量e,接收try块抛出的异常对象
e.printStackTrace();//创建异常变量
}
System.out.println("=================");
}
如果一个try块有多个catchkuai联用,只会执行第一个和异常匹配的catch块,其余的catch块全部忽略。
异常执行的顺序:
先执行try块的内容,顺序执行,如果在try块中有异常发生,转到catch块执行,同时中止try块中的其他代码。
当try…catch语句结束后,继续执行后面的代码。
finally语块,无论是否有异常发生,都会执行。一般用于流的关闭,数据库关闭等资源清理的操作。
finally语句块必须和try联用。如果在try块或catch块中有return语句,那么跳出方法之前,会执行finally语句。
finally在虚拟机关闭时(System.exit(0))不会执行
异常分为两种类型:
编译期异常(检查异常)是开发者必须处理,否则无法通过编译
运行期异常(非检查异常)是开发者可以处理,也可以不处理,即使不处理也可以通过编译
所有的运行异常都是RuntimeException的子类
ArithmeticException 算术异常,在执行了非法的算法运算时抛出,比如,除零操作
ArraayIndexOutOfBoundsException 数组下标越界异常,在访问数组元素时,使用非法下标进行访问时抛出。
(下标为负数,或下标大于等于数组的长度)
Class ClassCastException 类型转换异常,将一个类型化为另一个类型时,新的类型不匹配,指定对象时抛出
NumberFormatException 空指针异常,当对null值进行属性或者方法调用时抛出,
NumberFormatException 数字格式化异常,将字符串转化数字类型时,该字符串不是合法的数字格式时抛出
throw与throws的区别
throw是语句,表示显示抛出异常对象。throw new Exception();
throws是方法修饰符,表示该方法可能会抛出某种异常。那么,在调用该方法时,需要处理该方法抛出的异常。
重写的限制:子类方法的访问修饰符,要大于或等于父类方法。
子类方法抛出的异常,要小于或等于父类方法。