1.异常
1.1 异常的概念
程序在运行的过程出现的错误,称之为异常。
1.2 异常处理的重要性
如果异常不处理,那么就会终止java虚拟机的运行。意味着出现异常后面的代码就不会再执行了
int a = 10;
System.out.println(a/0);
//ArithmeticException
System.out.println("执行吗?");//不会执行
1.3 异常的分类
Throwable (异常的父类)
- Error(错误) 内存溢出、硬件等等(程序员无法通过程序解决)
- Exception(异常)
- 运行期异常(未检查) 程序运行期间出现的异常 RuntimeException
- 举例:空指针异常、类转换异常、数组下标越界异常、输入异常、下标越界异常等
- 编译期异常 (受检) 程序在编译期间出现的异常 Exception
- 举例:ParseException InterruptedException等
- 运行期异常(未检查) 程序运行期间出现的异常 RuntimeException
1.4 异常的解决(异常处理机制)
如果正确的处理了异常,那么不会终止JVM的运行
1.4.1 捕获(主动处理)
try、catch、finally
语法:
try{
可能会出现异常的代码
}catch(要捕获的异常类型1 变量名){
如果出现对应异常所执行的代码
}catch(要捕获的异常类型2 变量名 ){
如果出现对应异常所执行的代码
}…
- catch需要注意的点
- 1、catch中捕获的异常类型必须要与出现异常的类型要一致(大于等于),否则相当于没有处理异常
- 2、catch中的异常类型可以捕获多个,注意:捕获异常的顺序是从小到大
- 3、捕获异常的时候,可以捕获最大的异常Exception
- finally的特点
- 1、无论代码是否出现异常,都会执行finally中的代码
- 2、 一般在finally写释放资源的代码
- 3、如果方法中出现return关键字,finally依旧会执行.(但是如果调用System.exit(0);那么finally不会再执行)
- try catch finally使用语法
- try{…}catch(){…} 一起使用
- try{…}catch(){…}catch(){…} 一起使用
- try{…}finally{…} 一起使用
- ttry{…}catch(){…}catch(){…}finally{…} 一起使用
- 不能单独使用
捕获异常 代码执行的顺序
- 先执行try中的代码
- 1、没有异常,正常执行完整个程序
- 2、有异常 ,就会执行对应catch语句块。而try后面的代码就不会执行了
1.4.2 抛出(被动抛出)
-
a、在方法上声明 throws
- 语法: public void show() throws 异常的类型1,异常的类型2{}
- 特点:
- 1、如果在方法上声明异常,那么方法的调用者就要进行处理
- 2、如果异常声明在了main方法上,实际上就是给jvm处理(那就是没有处理)
- 3、声明异常可以声明多个
- 场景:
- 1、当前无法对异常进行处理的时候,就可以把异常抛给方法的调用者。
- 2、现在如果代码出现异常(直接try、catch)
-
特殊案例:
- 如果在main方法上声明(抛出)异常,那么这个异常就交给了main 方法的调用者。而main方法的调用者是jvm,所以这个异常并没有处理。
-
b、在方法内部抛出 throw
- 语法: throw 异常对象;
- 特点:
- 1、如果抛出运行期异常,那么直接抛出即可
- 2、如果抛出编译期异常,那么需要在方法上声明抛出
- 场景:
- 一般写框架的时候,设计
1.5 总结
- 1、运行期异常,可以利用逻辑判断解决(避免)
- 2、编译期异常,必须要解决 现在如果代码出现异常(直接try、catch)
1.6 自定义异常
- 1、自定义运行时异常
- 写一个类继承自RuntimeException
- 编写有参和无参构造方法
- 2、自定义编译期异常
- 写一个类继承自Exception
- 编写有参和无参构造方法
- 应用场景:
- 1、一般在系统的异常无法满足自己公司需求的时候会自定义异常。
- 2、自定义异常一般和throw抛出一起配合使用
public class AgeException extends RuntimeException{
public AgeException() {
super();
}
public AgeException(String message) {
super(message);
}
}
使用自定异常
public static void setAge(int age) {
if(age < 0 || age > 120) {
throw new AgeException("你的年龄不合法");
}
}
1.7 方法重写
继承中方法的重写
- 子类重写父类的方法,不能抛出比父类更大、更多的编译器异常