Throwable:
-
Error
-
Exception
1.RuntimeException
JVM如何处理异常:
main函数收到问题后,有两种方式:
- 自己将该问题处理,然后继续运行
- 自己没有针对的处理方法,只有交给调用main的jvm处理
jvm有一个默认的异常处理机制,就将该异常处理,就将该异常名称信息位置打印在控制台
世界上最真情的相依,是你在Try,我在Catch,无论你发什么脾气,我都默默接受处理
异常:
- 编译时异常:未雨绸缪,要提前想到可能会发生什么事
- 运行时异常:编译时不会报错,都是程序员犯的错误
- ArithmeticException
- ClassCastException
- ConcurrentModificationException
- IndexOutOfBoundException
- NullPointerException
throws:
- 如果抛出的是RuntimeException(运行时异常)及其子类,调用该方法的时候不用处理(抛不抛都一样)
- 如果抛出的不是RuntimeException(运行时异常)及其子类,调用方法必须处理
final:可以修饰类(不能被继承)、可以修饰方法(不能被重写)、可以修饰变量是常量(1.基本数据类型不能改变其值、2.引用数据类型不能改变其地址值但可以改变属性)
finally;写在try catch语句用于释放资源,用于关闭数据库,关闭流
finalize():是一个方法,在垃圾回收的时候调用
package day18;
public class Dk6Finally {
//finally面试题
//finally在return前执行
public static void main(String[] args) {
System.out.println(getNum());
}
public static int getNum() {
int x = 10;
try {
x = 10/0;
return x; //try和catch里面都应该有return语句,如果try语句没有检测到问题
} catch (Exception e) { //不会进入catch,那么需要try里面写返回语句
x = 20;
return x; //输出结果为20,因为执行catch时已经建立返回路径将20装进箱子,虽然finally将x=30,但返回路径没有变
}finally {
x = 30;
System.out.println("执行finally");
//finally可以写return语句,但是不要写,如果写了返回值就是30,因为会将前面的返回值覆盖掉
}
}
}
异常注意事项:
-
子类继承父类时,子类必须抛出和父类相同的异常或父类异常的子类(父亲坏了,儿子不能更坏)
class Fu{ public void print() throws FileNotFoundException{ System.out.println("Fu"); } } class Zi extends Fu{ public void print() throws Exception{ //这句话出错,因为Exception是FileNotFoundException的父类 System.out.println("Zi"); } }
-
如果父类抛出了多个异常,子类重写父类时,只能抛出相同的异常,或者是它的子集,子类不能抛出父类没有的异常
-
如果被重写的方法父类没有异常抛出,那么子类的方法绝对不可以抛出异常,如果子类方法有异常发生,那么子类只能try,不能throws
try和throws区别:
- 后续程序需要继续运行就try
- 后续程序不需要继续运行就throws
package day18;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Scanner;
public class Dk7Test {
//录入一个整数转换为二进制,输入过大整数有异常,有小数有异常,有其他字符有异常
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入整数:");
while(true) {
String str = input.nextLine();//如果直接用int接收,当输入字符串就报异常
try {
int num = Integer.parseInt(str); //将字符串转成整数
System.out.println(Integer.toBinaryString(num)); //转化为二进制
} catch (Exception e) {
try {
new BigInteger(str); //输入整数过大
System.out.println("输入整数过大");
} catch (Exception e2) {
try {
new BigDecimal(str); //输入小数,不可以放到BigInteger之前。因为BigDecimal可以接收过大整数和小数
System.out.println("输入小数");
} catch (Exception e3) {
System.out.println("输入非法字符");
}
}
}
}
}
}