201521123083《Java程序设计》第9周学习总结

1. 本周学习总结

1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容。

2. 书面作业

本次PTA作业题集异常

1.常用异常

题目5-1
1.1 截图你的提交结果(出现学号)

图片.png

1.2 自己以前编写的代码中经常出现什么异常、需要捕获吗(为什么)?应如何避免?

经常出现异常,输入的未知,以及写程序的时候没考虑好。甚至于一些不可知因素,都导致过程序异常,我写的时候就尽量保证输入端可控,就尽量用if来保证我的输入。需要捕获异常吗?这个不太需要,因为异常类型很多,如果每处都捕获的话,时间成本,以及代码的可读性不高。有些异常,比如数组越界这种,我们平时多加注意就好,并不需要捕获。

1.3 什么样的异常要求用户一定要使用捕获处理?

CheckedException要求用户一定要捕获异常。编译器强制检查,checked异常必须被捕获或者传播,这样就不会忘记处理异常。
《effective java》指出:对于可恢复的条件使用被检查的异常(CheckedException),对于程序错误(言外之意不可恢复,大错已经酿成)使用运行时异常(RuntimeException)。

2.处理异常使你的程序更加健壮

题目5-2
2.1 截图你的提交结果(出现学号)

图片.png

2.2 实验总结

这题刚开始一直报错,后来找了一找,发现是我直接把异常链打印出来,直接打印该异常就行,其他倒没什么。

3.throw与throws

题目5-3
3.1 截图你的提交结果(出现学号)

图片.png

3.2 阅读Integer.parsetInt源代码,结合3.1说说抛出异常时需要传递给调用者一些什么信息?
 public static int parseInt(String s) throws NumberFormatException {
        return parseInt(s,10);//往上抛了
    }
public static int parseInt(String s, int radix)
                throws NumberFormatException
    {
        /*
         * WARNING: This method may be invoked early during VM initialization
         * before IntegerCache is initialized. Care must be taken to not use
         * the valueOf method.
         */

        if (s == null) {
            throw new NumberFormatException("null");
        }

        if (radix < Character.MIN_RADIX) {
            throw new NumberFormatException("radix " + radix +
                                            " less than Character.MIN_RADIX");
        }

        if (radix > Character.MAX_RADIX) {
            throw new NumberFormatException("radix " + radix +
                                            " greater than Character.MAX_RADIX");
        }

由上面可见,就算一个同一个异常,他具体触发的条件也是不同的,这时候就可以通过给异常构造器传入不同的参数使打印的时候打印更加具体的内容.

3.1 截图你的提交结果(出现学号)

图片.png

3.2 一个try块中如果可能抛出多种异常,捕获时需要注意些什么?

一定要让异常的范围按从小到大排列
因为如果父类在前,子类在后,写子类也没什么意义了,因为肯定没你什么事了,都被父类捕光了.

5.为如下代码加上异常处理

byte[] content = null;
FileInputStream fis = new FileInputStream("testfis.txt");
int bytesAvailabe = fis.available();//获得该文件可用的字节数
if(bytesAvailabe>0){
    content = new byte[bytesAvailabe];//创建可容纳文件大小的数组
    fis.read(content);//将文件内容读入数组
}
System.out.println(Arrays.toString(content));//打印数组内容  
5.1 改正代码,让其可正常运行。注1:里面有多个方法均可能抛出异常。注2:要使用finally关闭资源
byte[] content = null;
		FileInputStream fis = null;
		try {
			fis = new FileInputStream("testfis.txt");
			int bytesAvailabe = fis.available();//获得该文件可用的字节数
			if(bytesAvailabe>0){
			    content = new byte[bytesAvailabe];//创建可容纳文件大小的数组
			    fis.read(content);//将文件内容读入数组
			}
			System.out.println(Arrays.toString(content));//打印数组内容 
		} catch (FileNotFoundException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		} catch (IOException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}finally {
			try {
				fis.close();
			} catch (IOException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}
		}
5.2 使用Java7中的try-with-resources来改写上述代码实现自动关闭资源.
		byte[] content = null;
		try (FileInputStream fis = new FileInputStream("testfis.txt")){			
			int bytesAvailabe = fis.available();//获得该文件可用的字节数
			if(bytesAvailabe>0){
			    content = new byte[bytesAvailabe];//创建可容纳文件大小的数组
			    fis.read(content);//将文件内容读入数组
			}
			System.out.println(Arrays.toString(content));//打印数组内容 
		} catch (FileNotFoundException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		} catch (IOException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
		 

跟python的上下文管理器挺像的

6.重点考核:使用异常改进你的购物车系统(未提交,得分不超过6分)

举至少两个例子说明你是如何使用异常处理机制让你的程序变得更健壮。


通过自定义异常来保证顾客买商品时商品数量不会为负数

通过捕获异常来保证读取文件不会出现错误

原文地址:https://www.cnblogs.com/daikersec/p/6742790.html