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

1. 本周学习总结

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

异常分为uncheckedExceptioncheckedException

  • checkedException
    继承自Exception的非RuntimeException
  • uncheckedException
    继承自RuntimeException的异常类,例如ArrayIndexOutOfBoundsException,NullPointerException

二者的区别是uncheckedException可以不用throws 声明及try-catch块包围,因为此类异常一般都是“错误”的程度,例如ArrayIndexOutOfBoundsException就是代码中错误地访问了数据越界的位置导致的,应该在代码中予以修改

Exception也是一种类,所以它也有很多方法

  • getMessage
    获取异常的详细信息,一般是异常生生成的时候构造器里的String参数,类似于我们其他类的toString方法

  • getStackTrace
    返回一个数组,数组内的元素反映的是该异常自生成以来所经过的每一步,例如一个异常是从一个叫uncheckedExceptionTest的方法中抛出的,在main中被捕获,调用该方法就可以看到它的轨迹

  • fillInStackTrace
    该方法会建立一个新的轨迹记录数组,如图

  • getCause
    这个方法的由来是,异常的构造器可以接受另一个异常作为参数,表示这是它的cause ,这个方法就可以把一个异常的cause展现出来

    可以看到最终捕获的是一个RuntimeException,cause是checkedException函数中抛出的Exception

2. 书面作业

题集jmu-Java-05-集合之4-1

1.常用异常

题目5-1

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

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

ArrayIndexOutOfBoundsException,不需要捕获,因为它是一个uncheckedException,在逻辑上避免该异常

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

继承自Exception(且并不是RuntimeException的子类)的异常

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

题目5-2

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

2.2 实验总结

catch到像这道题目一样的简单异常情况后,可以采用恢复行为,比如这题index从0自增到数组的length,异常的时候可以让index不增加
不过在程序比较大的情况下就比较难设计恢复行为

3. throw与throws

题目5-3

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

3.2 阅读Integer.parsetInt源代码,结合3.1说说抛出异常时需要传递给调用者一些什么信息?

需要传递的信息是:异常的类型名,异常发生的位置,异常所经过的栈轨迹,异常的详细信息说明,异常发生的代码行数

4. 函数题

题目4-1(多种异常的捕获)

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

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

如果有多个catch块,而且其中的两种潜在的异常有继承关系,那么需要将子类的catch块放在前面,因为如果不这样做的话,父类的catch语句会先catch到子类异常,导致在后面的子类catch块永远无法执行,实际上,这都无法通过编译

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 改正代码,让其可正常运行。注意:里面有多个方法均可能抛出异常

	try
	{
		byte[] content = null;
		FileInputStream fis = null ;
		try
		{
			fis= new FileInputStream("testfis.txt");
		}catch(FileNotFoundException e)
		{
			System.out.println(e);
		}
		int bytesAvailabe = fis.available();//获得该文件可用的字节数
		if(bytesAvailabe>0){
		    content = new byte[bytesAvailabe];//创建可容纳文件大小的数组
		    fis.read(content);//将文件内容读入数组
		}
		System.out.println(Arrays.toString(content));//打印数组内容
		try
		{
			if(fis!=null)
				fis.close();//尝试关闭文件
		}catch(IOException e)
		{
			e.printStackTrace();
		}
	}
	catch(Exception e)
	{
		System.out.println(e);
	}

手动将文件名改成不存在的文件,捕获到两个异常
java.io.FileNotFoundException: testfis2.txt (系统找不到指定的文件。)
java.lang.NullPointerException

5.2 如何使用Java7中的try-with-resources来改写上述代码实现自动关闭资源?

	try(FileInputStream fis =new FileInputStream("testfis.txt");)
	{
		byte[] content = null;		
		int bytesAvailabe = fis.available();//获得该文件可用的字节数
		if(bytesAvailabe>0){
		    content = new byte[bytesAvailabe];//创建可容纳文件大小的数组
		    fis.read(content);//将文件内容读入数组
		}
		System.out.println(Arrays.toString(content));//打印数组内容			
	}
	catch(FileNotFoundException e)
	{
		e.printStackTrace();
	}
	catch (IOException e) {
		e.printStackTrace();
	}

离开try块的时候会自动关闭fis资源

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

举至少两个例子说明你是如何使用异常机制让你的程序变得更健壮。
说明要包含2个部分:1. 问题说明(哪里会碰到异常)。2.解决方案(关键代码)

首先是一个 FileNotFoundException,在每一次的文件读取与写入的时候都采用了throws声明向上抛出 如下手动删除用户信息文件的时候捕获到的异常

接下来是 “用户是在用户数据文件中注册的用户但是用户的用户信息文件丢失”这里我们是手动将agt用户的信息文件改名为agtX

异常处理如下
如果catch到该种错误 即setName会出现错误,那么我们手动调用savechange方法生成一个新的agt用户信息文件

结果如下 :

捕获异常并生成文件

按下显示agt的购物车 发现显示成功 一个空的购物车

8.选做:课外阅读

JavaTutorial中Questions and Exercises

  • 异常之间若存在继承关系则要将子类catch块放在前面,类似catch(Exception e )这样的代码会捕获任意异常,最好不要这样使用
  • 可以只存在try块与finally块 意为try块中无论什么情况都执行finally内容,例如资源的关闭
  • 还了解了几种不同情况的异常等级

3. 码云上代码提交记录

题目集:异常

4. 课外阅读

Best Practices for Exception Handling
Exception-Handling Antipatterns Blog
The exceptions debate

任选下面一篇文章阅读,列举出几点自己能理解的异常处理最佳实践

  • 不要在无法handle的时候catch一个异常,忽视异常是有风险的行为
  • 如果一个checkedException出现后无法采用有效的恢复行为,那就可以考虑直接将它变为uncheckedException了
  • 记住清理资源

posted on 2017-04-22 13:30  Agt  阅读(236)  评论(2编辑  收藏  举报

导航