异常
在学习IO流之前要先学习异常,因为IO流无非就是上传文件和下载文件,在这过程中或许会出现问题,我们要解决这个问题,因此要先学习异常,异常也就是在程序运行时出现的错误,它分为运行异常和编译异常。
编译异常 | 运行异常 |
---|---|
Java程序必须显示处理,否则程序就会发生错误,无法通过编译 | 无需显示处理,也可以和编译异常一样处理 |
异常的继承体系
try...catch的方式处理异常
格式一:
try {
可能出现问题的代码 ;
}catch(异常名 变量名){
针对问题的处理 ;
}finally{
释放资源;
}
finally可以省略,如果加上它的话,不管代码是否正确都会执行里面的内容,如下:
try {
可能出现问题的代码 ;
}catch(异常名1 变量名1){
针对问题的处理1 ;
}catch(异常名2 变量名2){
针对问题的处理2 ;
}
.....
注:平级关系的异常谁前谁后无所谓,如果出现了子父关系,父必须在后面
当你需要捕获不同的错误时,catch可以多写几次catch语句,也可以如下(JDK1.7及以上):
try {
可能出现问题的代码 ;
}catch(异常名1 | 异常名2 | .... 变量名){
对异常的处理方案 ;
}
注:多个异常之间只能是平级的关系,不能出现子父类的继承关系
面试题:final,finally和finalize的区别
final:是一个状态修饰符,被它修饰的方法或变量不能被重写,呗它修饰的类不能被继承(也就是不能有子类)
finally:它是用在try...catch语句中,是用来释放资源的,不管程序有没有捕获错误始终要执行这里面的语句
finallize:Object类中的一个方法,用来回收垃圾的
面试题: 如果catch里面有return语句,请问finally的代码还会执行吗?如果会,请问是在return前还是return后
会执先执行finally,finally是无论有没有异常都会执行的,因此在return前执行
throws的方式处理异常
这种处理异常的方式其实就是把异常抛给调用者去处理,自己不用管,与自定义异常有关,直接在方法声明的大括号前加上throws 错误类型就可以了。
throw的方式处理异常
这种方式处理异常是在方法中处理,当出现错误时就把异常对象抛出
throw | throws |
---|---|
用在方法体内,跟的是异常对象名,只能抛出一个异常对象名,这个异常对象可以是编译异常对象,也可以是运行异常对象,表示抛出异常,由方法体内的语句处理 | 用在方法声明后面,跟的是异常类名,可以跟多个异常类名,用逗号隔开,表示抛出异常,由该方法的调用者来处理, 表示出现异常的一种可能性,并不一定会发生这些异常 |
自定义异常
在开发过程中会出现各种各样的异常,JKD不可能针对每一种问题都会给出异常与之对应,因此就有了自定义异常,根据我们的需求自己定义异常,需要写一个错误类来继承RuntimeException,再用throw来抛出。
代码演示
自定义异常
//自定义异常需要继承RuntimeException
public class EException extends RuntimeException{
//重写构造函数,这样加载时就可以给出想要的错误提示
public EException(){
System.out.println("你取得金额大于你银行卡里的钱!");
}
}
import java.util.Scanner;
public class Bank1 {
public static void main(String[] args) {
int money=100;
Scanner sc = new Scanner(System.in);
System.out.println("请输入要取的金额:");
int m=sc.nextInt();
if((money-m)>=0){
System.out.println("你所剩的金额为:"+(money-m));
}else {
//用throw在方法中抛出错误
throw new EException();
}
}
}
结果
请输入要取的金额:
200
Exception in thread "main" org.ji16.code.EException
at org.ji16.code.Bank1.main(Bank1.java:13)
你取得金额大于你银行卡里的钱!
try...catch异常
public class File10 {
public static void main(String[] args){
//catch中写得是错误的类型,你可以用|分开错误类型,父类必须在最后
try {
System.out.println(23 / 0);
} catch (Exception e) {
//在输出语句中有也可以写e.getMessage()或e.toString()或e.printStackTrace()
System.out.println("哦,catch了...............");
return ;
}finally {
//这个语句会在return(结束)语句之前执行,因为无论有没有错误抛出finally语句都会执行
System.out.println("哦,被执行了..............");
}
}
}
//Throwable的几个常见方法
//getMessage() 获取异常信息,返回字符串
//toString() 获取异常类名和异常信息,返回字符串
//printStackTrace() 获取异常类名和异常信息,以及异常出现在程序中的位置,返回值void
结果
哦,catch了...............
哦,被执行了..............