文章目录
我们在写代码的时候,经常出现一些小问题,为了方便我们处理这些问题,Java为我们提供了异常机制。异常包含了错误的类型、原因以及位置。
异常:不正常,我们在写代码的时候出现的 编译或者 运行时的错误。
一、异常的体系结构
Throwable
最顶层- ——
Error
:出现的不能够处理的严重问题 - ——
Exception
:可以处理的问题
二、异常的处理方式
捕获处理
try...catch
语句
代码示例
try{
有可能出现问题的代码; //出现异常,会创建一个对象
}catch(ArithmeticException e){
处理异常;
}
try...catch
的执行顺序:
首先执行try
语句,如果发现异常,异常下面的代码不再执行,直接跳入catch
语句,catch
语句结束后,整个try...catch
结束;如果没有发现异常,try
语句执行的结束后,try...catch
直接结束,不再执行catch
语句。
抛出去
当我们不想处理异常,或者没有能力处理的时候,我们可以选择抛出异常,谁调用方法谁抛出,使用关键字throws
在方法的声明处抛出异常。
三、JVM处理异常的方式
如果出现异常,我们没有处理,JVM会帮我们进行处理,它会把异常的类型、原因和位置显示在命令行,并且终止了程序,异常后面的代码将不再执行。
四、如何处理多个异常
可以使用多个try...catch
语句,一个try
,多个catch
。
多个catch之间的顺序
- 平级之间没有顺序关系
- 如果有子父类,父类异常必须放在后面。
代码示例
try{
String s = null;
System.out.println(s.length);
}catch(ArrayIndexOutOfBoundsException e){
System.out.println("数组越界");
}catch(NullPointerException e){
System.out.println("出现空指针");
}catch(Exception e){
System.out.println("出现异常了");
}
五、Throwable的常用方法
try{
可能出现问题的代码;
}catch(Exception e){
System.out.println(e.getMessage()); //String getMessage();原因
System.out.println(e.toString()); //String toString(); 类型+原因
System.out.println(e.printStackTrace()); //void printStackTrace();类型+原因+位置
}
六、finally
组合try...catch
使用,用于释放资源等收尾工作。
无论try...catch
语句如何执行,finally
的代码一定执行。
代码示例
try{
有可能出现问题的代码;
}catch(Exception e){
处理异常;
}finally{
释放资源;
清理垃圾;
}
七、异常的分类
- 运行时期异常:
RuntimeException
的子类就是运行时期异常,在编译时期可以选择处理或不处理。 - 编译时期异常:
Exception
的子类,非RuntimeException
的子类,在编译时期必须处理。
八、自定义异常类
throws
处理异常的方法,把异常跑出去,由调用者处理。throw
制造异常的方式,并且结束异常。
注意:如果抛出的是编译时期异常,必须在方法声明处抛出(throws
)。
异常如何自定义呢?
写一个类去继承Exception
或RuntimeException
,然后实现多个异常构造即可(给父类传递错误原因)。
代码示例
public static void main(String[] args){
try{
checkScore(110);
}catch(Exception e){
e.printStackTrace();
}
}
public static void checkScore(int score) /* throws Exception*/{ //若继承编译时期异常Exception
if(score < 0 || score > 100){
throw new MyException("考试成绩不符合要求");
}
System.out.println("考试成绩符合范围"); //一旦上面抛出了错误,这一句不会执行,相当于else了
}
--------MyException类----------
public class MyException extends RuntimeException{ //若继承Exception编译时期异常,则上面checkScore方法需抛出错误
public MyException(){
super();
}
public MyException(String message){
super(message);
}
}
错误类构造方法的生成:source -> generate constructors from superclass (选有参和无参)。
九、递归
把大问题拆成小问题,然后把小问题拆成更多小问题,但我们把更多小问题解决了,小问题就解决了,随着小问题解决了,大问题也随之解决了。
5的阶乘代码示例
public static void main(String[] args){
int result = jieCheng(5);
System.out.println(result);
}
public static int jieCheng(int n){
if(n == 1){ //必须要有出口,方法运行至出口后依次弹栈。
return 1;
}else{
return n*jieCheng(n - 1)
}
}
不死兔子代码示例
public static void main(String[] args){
int result = method(20);
System.out.println(result);
}
public static int method(int n){\
if(n == 1){
return 1;
}else if(n == 2){
return 1;
}else{
return method(n - 1) + method(n - 2);
}
}