01_Finally
finally:不管有没有异常,finally里面的代码都会执行。
- finally的特点
- 被finally控制的语句体一定会执行(前提 jvm没有停止)
特殊情况:在执行到finally之前jvm退出了(比如System.exit(0)) - finally的作用: 用于释放资源,在IO流操作和数据库操作中会见到
案例演示
package FinallyDemo01;
import java.util.InputMismatchException;
import java.util.Scanner;
public class FinallyTest01 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
try {
System.out.println(1 / 0);
System.out.println("请输入一个整数");
int num = scanner.nextInt();
System.out.println(num);
}catch (Exception e){
e.printStackTrace();
//System.exit(0);
}finally {
System.out.println("finally 里面的代码执行了");
//释放
scanner.close();
}
}
}
执行结果为
java.lang.ArithmeticException: / by zero
at FinallyDemo01.FinallyTest01.main(FinallyTest01.java:10)
finally 里面的代码执行了
01.1_final,finally和finalize的区别
- final: 是一个状态修饰符, 可以用来修饰类 , 变量 , 成员方法.
- 被修饰的类不能被子类继承, 修饰的变量其实是一个常量不能被再次赋值
- 修饰的方法不能被子类重写
- finally:用在try…catch…语句中 , 作用: 释放资源 . 特点: 始终被执行(JVM不能退出)
- finalize: Obejct类中的一个方法,用来回收垃圾
案例演示:如果catch里面有return语句请问finally的代码还会执行吗?如果会,请问是在return前还是return后。
package FinallyDemo01;
public class FinallyTest02 {
public static void main(String[] args) {
try {
System.out.println(23 / 0);
} catch (Exception e) {
System.out.println("哦,catch了...............");
return ;
}finally {
System.out.println("哦,被执行了..............");
}
}
}
执行结果
哦,catch了...............
哦,被执行了..............
会执行, 在return前
02_自定义异常类
02.1_概述
-
为什么要有自定义异常:Java给我们提供了很多异常,来描述我们在开发中所遇到一些常见问题,还是不足以描述我们所遇到的一些异常情况。
-
自定义异常概述 需要将我们自定义的异常类纳入到我们的异常体系中
1.继承自Exception
2.继承自RuntimeException
案例演示:自定义异常
package customDemo01;
//自定义异常 需要把这个类纳入到Java异常类体系中
public class NoMoneyException extends RuntimeException {
public NoMoneyException(String message) {
}
}
package customDemo01;
import com.oracle.xmlns.internal.webservices.jaxws_databinding.XmlOneway;
import java.util.Scanner;
//自定义异常
public class customTest01 {
private static double money=100;
public static void main(String[] args) {
//取款案例
/*1.定义一个数字,100,如果你输入的数字大于100,输出余额不足
* 如果数字小于100,输出取款成功,还有剩余额
2,然而异常中没有余额异常,我们可以自定以一个余额异常
*/
Scanner scanner = new Scanner(System.in);
System.out.println("请输入取款金额");
double num=scanner.nextInt();
//调用一个方法
take(num);
}
private static void take(double num) {
if (num<=money){
System.out.println("取款成功");
System.out.println(money-num);
}else {
throw new NoMoneyException("余额不足异常");
}
}
}
运行结果
请输入取款金额
101
Exception in thread "main" customDemo01.NoMoneyException
at customDemo01.customTest01.take(customTest01.java:29)
at customDemo01.customTest01.main(customTest01.java:21)
注意:
- 子类在重写父类方法是,父类方法没有抛出异常,子类在重写时不能抛出异常
- 父类方法如果有跑出异常,那么子类在重写父类方法时,可以跑出和父类一样的异常,或者说比父类的异常小,或者说不抛异常也可以
- 子类不能跑出父类没有跑出的一张