javaSE (二十八)异常的两个分类、final、finally、finalize的区别、return在finally前后执行问题、异常练习题

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、异常练习题:

问题描述:输入一个二进制整数,输入过大、过小、非法字符都要报错
思路:

  1. 键盘输入二进制字符串
  2. 字符转换成整数
  3. 整数转换成二进制
  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("此数是非法字符,请重新输入:");
					}	
				}
			}
		}		
	}
}



猜你喜欢

转载自blog.csdn.net/weixin_39782583/article/details/84891016
今日推荐