1、异常的两个分类:
编译时异常: 在编译某个程序时,有可能会发生的事情,比如文件找不到,这样的异常必须在编译的时候处理,如果不处理编译通不过
运行时异常: 就是程序员犯的错误,需要回来修改代码
2、final、finally、finalize的区别:
final:修饰类不能被继承,修饰方法不能被重写,修饰变量只能被赋值一次
finnally:是try语句中的一个语句体,不能单独使用,用来释放资源
finalize:当垃圾回收器确定不存在该对象的更多引用时,由对象的垃圾回收器调用该方法
3、return在finally前后执行问题:
问:下面的x输出什么值:
return就像是一个人的最后一口气,在要挂掉之前,看一看finally里面有没有要执行的东西,但是这个地方,在catch里面,已经把x装箱了(return),建立了一个返回路径,虽然还是会执行finally语句,但是不会改变x的赋值,所以,finally通常是关掉流,节约资源的作用,并不作赋值使用
package cn.nupt;
public class ExtractionTest {
public static void main(String[] args) {
System.out.println(finTest());
}
public static int finTest() {
int x = 10;
try {
x = 20;
System.out.println(1 / 0);
return x;
} catch (Exception e) {
x = 30;
return x;
} finally {
x = 40;
}
}
}
4、异常练习题:
问题描述:输入一个二进制整数,输入过大、过小、非法字符都要报错
思路:
- 键盘输入二进制字符串
- 字符转换成整数
- 整数转换成二进制
- try-catch
注意:我们的异常都是在原有的异常上面叠加try-catch的,依次
检验异常
用一个while循环保证字符串可以持续输入
代码:
package cn.nupt;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Scanner;
public class ExtractionTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个整数:");
while(true) {
String line = sc.nextLine();
try {
int num = Integer.parseInt(line);
System.out.println(Integer.toBinaryString(num));
} catch (Exception e) {
try {
new BigInteger(line);
System.out.println("此数过大,请重新输入:");
} catch (Exception e1) {
try {
new BigDecimal(line);
System.out.println("此数是分數,请重新输入:");
} catch (Exception e2) {
System.out.println("此数是非法字符,请重新输入:");
}
}
}
}
}
}