一、异常概念
异常就是Java在程序运行时发生的错误。
二、异常分类
Throwable
Error:服务器宕机,数据库崩溃,不是程序员编写代码所产生的错误。
Exception(异常)
RuntimeException:编写代码产生错误,在运行时产生异常,需要我们去改写代码,这是我们需要掌握。
此外异常又分为:
编译时异常(未雨绸缪):Java程序必须显示处理,否则程序就会发生错误,无法通过编译。例如:一个文件找不到,需要抛出异常,如果没有处理,这样就会发生错误,这样的错误就叫做编译时异常。不处理编译不过。
运行时异常:编译通过了,但是出错了,无法运行成功,就是程序需要回来修改代码。无需显示处理,也可以和编译时异常一样处理(在可能错误的地方抛出异常)。这种错误叫做运行时异常。
三、异常语句结构
异常语句3种搭配方式
- try{}catch(){}......
- try{}catch(){}......finally{}
- try{}finally{}
try:用来检验异常,就是将可能发生错误的代码放入try{}语句中。
catch(){}:用来捕获异常,对产生异常进行处理,可以说明输出是啥异常等。在处理多个异常时,跟多个catch,那么小的异常放前面,根据多态原理,如果大的放前面,就会将所有子类对象接收,后面的catch就没有意义了。所以一般最后一个是最大的类Exception 例如:catch(Exception e) {},这样,就算出现其它异常,也会根据多态原理捕获异常(当空指针的时候,如果使用了Exception处理异常,其结果就是 Exception e = new NullPointException())。
finally{}:用来释放资源,它控制的语句体一定会被执行(除非是System.exit(0),在执行之前jvm提前退出了),在IO流与数据库操作中经常使用。
四、throw与throws的区别
throw:在功能方法内部出现某种情况,程序不能继续运行,需要进行跳转时,就用throw把异常对象抛出。
- 作用在方法体内,是一个实例对象
- 只能抛出一个异常对象(throw new Exception("出错了");)
- 表示抛出异常,由方法体内的语句处理
throws:定义功能方法时,需要把出现的问题暴露出来让调用者处理,那么就通过在方法上标识。
- 作用在方法声明后面,跟的是异常类名
- 可以跟多个异常类名,用逗号隔开
- 表示抛出异常,由该方法的调用者来处理
五、自定义异常
自定义异常就是为了能够通 "异常名字" 更快看出报的是啥错误,有针对的解决方法。自定义异常类必须继承Exception或RuntimeException。
package com.xue.test;
/**
* 定义1个异常:AgeOutOfBoundsException
* 定义一个Student
* 在里面的setAge方法中,年龄如果超过20岁就抛出AgeOutOfBoundsException异常,并提示年龄超出范围
* Test测试
*
* @author
*
*/
public class Test18 {
public static void main(String[] args) {
Student stu = new Student();
try {
stu.setAge(21);
} catch (AgeOutOfBoundsException e) {
e.printStackTrace();
}
}
}
class Student {
private int age;
public int getAge() {
return age;
}
public void setAge(int age) throws AgeOutOfBoundsException {
if (age < 20) {
this.age = age;
} else {
throw new AgeOutOfBoundsException("年龄超出");
}
}
}
class AgeOutOfBoundsException extends Exception {
public AgeOutOfBoundsException() {
super();
}
public AgeOutOfBoundsException(String message) {
super(message);
}
}