异常 EXception
- 异常是指在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序,由Java应用程序抛出和处理的非严重错误
异常分为Checked异常和运行时异常
Checked异常必须捕获或者声明抛出
运行时异常不要求必须捕获或者声明抛出
- 异常处理:Java编程语言使用异常处理机制为程序提供了错误处理的能力,使程序发生异常后不会影响后续代码的执行
- try-catch-finally结构中try语句块是必须的,catch、finally语句块均可选,但两者至少出现之一
- Java的异常处理是通过5个关键字来实现的:try、catch、 finally、throw、throws
- 异常处理原则
异常处理原则:
1:异常处理与性能
2:异常只能用于非正常情况
3:不要将过于庞大的代码块放在try中
4:在catch中指定具体的异常类型
5:需要对捕获的异常做处理
- 异常体系
异常分为RuntimeException 和SQLException,都继承于Exception,Exception和Error继承于Throwable类,所以Throwable类是所有异常的直接或间接父类,Throwable类继承Object类
异常关键字
- try:执行可能产生异常的代码块
- finally:无论是否发生异常,始终都会执行的代码块
1:finally块唯一不执行的情况,除非程序执行到finally之前就结束了,如在finally执行到了System.exit(1);
2:try-catch块中存在return语句,还是会执行finally块再执行return语句
- throw:生成并抛出异常
- throws:声明方法可能要抛出的各种异常
1:throws声明某个方法可能抛出的各种异常,多个异常用逗号隔开
2:抛出运行时异常时,可以不在方法上声名抛出异常
1:捕获异常,可以在其中加入发生异常时需要执行的代码块
2:可以写多个catch,可以根据不同的异常类型做不同的处理
3:也可以在一个catch中捕获多个异常
4:捕获的异常种类必须填写正确,不然无法捕获,Exception可以捕获所有异常,所以捕获多个异常时,Exception不能排第一个
5:可以加入用户自定义处理信息,System.err.println("出现错误:被除数和除数必须是整数");
6:调用方法输出异常信息,e.printStackTrace();
语法:
try{
//需要监听的代码块
}
catch(异常类型 异常名称/e){
//对捕获到try监听到的出错的代码块进行处理
throw 异常名称/e; //thorw表示抛出异常
throw new 异常类型(“自定义”);
//System.err.println()
//可以打印红色字体提示
}
finally{
//finally块里的语句不管异常是否出现,都会被执行
}
修饰符 返回值 方法名 () throws 异常类型{ //throws只是用来声明异常,是否抛出由方法调用者决定
自定义异常
- 当JDK 中的异常类型不能满足程序的需要时,可以自定义异常类
- 使用自定义异常的步骤
1.定义异常类
2.编写构造方法,继承父类的实现(继承继承Throwable类、继承Excepion 或者RuntimeException)
3.实例化自定义异常对象
4.使用throw抛出
class WrongInputException extends Exception { // 自定义的类
WrongInputException(String msg) {
super(msg);
}
}
class Input {
void method() throws WrongInputException {
throw new WrongInputException("Wrong input"); // 抛出自定义的类
}
}
class TestInput {
public static void main(String[] args){
try {
new Input().method();
}
catch(WrongInputException wie) {
System.out.println(wie.getMessage());
}
}
}
以上代码运行输出结果为:
Wrong input
异常信息
知识点
- 调用抛出了异常的方法时,必须要对异常进行处理
处理方式
1:通过try---catch的方式处理异常
2:继续往上抛出异常
注意:main()方法声明的异常由Java虚拟机处理,一般不建议将异常抛给虚拟机,如果虚拟机处理不了的话,整个程序会报错
- 异常链:在捕获一个异常后抛出另外一个异常,并且希望把异常原始信息保存下来,这被称为异常链(创建了一个新的异常且保留了原始的异常信息)
- 异常和返回值
public int test (int chioce) {
if(chioce >0) return 1;
if(chioce==0) return 0;
//小于0的情况不返回int类型的值,抛出异常,不会报返回值错误
throw new RuntimeException("只能时大于等于0的数字");
//if(chioce==0) return 0;//永远不抵达的代码,会报错,死循环后面加代码也时一样的
}
- printStackTrace()的堆栈跟踪功能显示出程序运行到当前类的执行流程(弹栈,最先发生异常的地方最后显示出来)
- 异常对象常用的方法
void printStackTrace() 输出异常的堆栈信息
String getMessage() 返回异常信息描述字符串,是printStackTrace()输出信息的一部分
常见异常
InputMismatchException 输入不匹配
NumberFormateException 数字格式化异常
ArrayIndexOutOfBoundsException 数组索引越界
NegativeArraySizeException 数组长度负数
NullPointerException 空指针异常
ArithmeticException 算术错误情形,如以零作除数
ClassCastException 造型异常,将对象的类型还原时与真实类型不匹配
IllegalArgumentException 方法接收到非法参数
错误 Error
- 仅靠程序本身无法恢复的严重错误
常见错误
StackOverflowError 栈内存溢出错误