智渔课堂官方免费教程三十八 :Java基础教程之异常

时间:2022-03-20 16:07:55

异常

程序中不正常的情况分为两大类:错误(Error)和异常(Exception)

错误(Error):程序本身无法对这种不正常的情况进行处理,将会导致程序崩溃;
例如:内存耗尽错误,JVM崩溃错误等
异常(Exception):程序可以特殊的代码,对不正常的情况进行捕获和处理,程序可以继续运行;
例如:除零异常,空指针异常,数组下标越界异常

捕获异常

语法格式1:
try{
//可能出现异常的代码
}catch(异常类 变量名){
//出现异常后的处理代码
//printStackTrace();方法会输出栈内存中的异常信息
变量名. printStackTrace();
}

语法格式2:
try{
//可能出现异常的代码
}finally{
//finally块:一般释放资源的语句,比如关闭流,关闭数据库的连接
}
finally:不管try中的代码是否出现异常,都会执行finally块中的代码

语法格式3:
try{

}catch(异常类 变量名){

}finally{
//即使try块或catch块中出现return语句,finally块中依然会执行
//如果在try块或catch块中出现System.exit(int);语句,finally块将无法执行
}

多重catch块:多重catch块中的异常类,一定是从小到大排列,兄弟异常类不分顺序
try{

}catch(子异常类 变量名){

}catch(子异常类 变量名){

}catch(父异常类 变量名){

}...[finally{}]

try、catch和finally都不能单独存在,但是try和catch 、 try和finally 可以在一起使用,catch和finally不能单独在一起使用

声明异常

语法格式:[访问修饰符] 返回值类型 方法名() throws 异常类{}

抛出异常

语法格式:throw 异常对象;

实例:
package exception;

/**
* 演示异常的声明和抛出
*
* @author 学霸联盟 - 赵灿
*/
public class ExceptionDemo {
//声明方法m1,并声明该方法会出现一个RuntimeException类型的异常
public void m1() throws RuntimeException {
/*
* 抛出一个RuntimeException类型的异常,没有使用try-catch捕获
* 使用声明异常的方式,将此处抛出的异常交给调用者m2处理
* 声明异常的类型,必须是抛出异常类型或其父类型
*/
throw new RuntimeException();
}

//声明方法m2,并声明该方法会出现一个Exception类型的异常
public void m2() throws Exception {
try {
// 调用声明了RuntimeException异常的方法m1
// 并使用try-catch处理m1中抛出的异常
m1();
/*
因为catch块是按照异常类型匹配捕获的,而方法m1声明的是RuntimeException;所以catch的小括号中只能声明RuntimeException或RuntimeException父类型的变量不能声明RuntimeException的子类变量,因为这样不能保证异常被捕获
*/
} catch (Exception ex) {
// 此处抛出了一个Exception类型的异常
// 没有使用try-catch进行捕获处理,所以该方法也必须声明异常
throw new Exception();
} finally {
/*
* 不管try和catch块中的代码是否抛出异常,finally块中的代码都会执行
* 即使try或catch块中执行了return语句,finally块中的代码也会执行
* 除非try或catch块中执行了System.exit(int);
* 或出现错误导致JVM崩溃,finally将不再执行
*/
}

}

// 方法m3
public void m3() {
try {
/*
* 调用声明了Exception异常的方法m2,而m3没有声明异常,
* 所以必须使用try-catch块处理方法m2产生的异常
*/
m2();
} catch (Exception ex) {
/*
* 抛出Exception类型的异常,而且没有使用try-catch进行捕获,也没有声明异常;
* 但是在finally块中使用的return语句,所以代码可以正常编译和执行
*/
throw new Exception();
} finally {
/*
* finally块中使用了return语句;
* 会将catch块中抛出的Exception类型的异常覆盖;
* 所以该方法可以既不声明异常,也不使用try-catch处理catch块中抛出的异常;
* 一般不建议这样使用
*/
return;
}
}

public static void main(String[] args) {
ExceptionDemo t = new ExceptionDemo();
t.m1();
}
}

自定义异常

继承Exception或Exception的子类
实例:
/**
* 演示自定义异常类
* @author 学霸联盟 - 赵灿
*/
public class MyExceptionDemo extends Exception{
public static void main(String[] args) {
try {
throw new MyException();
} catch (MyException e) {
//调用printStackTrace方法
e.printStackTrace();
}
}
}


/**
* 创建自定义异常类MyException,继承Exception类或Exception的子类
* @author 学霸联盟 - 赵灿
*/
class MyException extends Exception{
/**
* 重写父类中的printStackTrace
*/
@Override
public void printStackTrace() {
System.out.println("恭喜你,中了我的自定义异常!");
}
}