第9周作业-异常
1.本周学习总结
2.书面作业
本次PTA作业题集异常 1.常用异常 题目5-1 1.1 截图你的提交结果(出现学号)
1.2 自己以前编写的代码中经常出现什么异常、需要捕获吗(为什么)?应如何避免?
像自己以前经常出现的异常有ArrayIndexOutOfBoundsException(数组越界)、 NullPointerException(空指针)、ClassCastException(强制类型转换错误)等等,虽然这些都是异常,但是我们却不需要去捕获,因为它们都继承自RuntimeException异常类,继承该类的异常都无需去捕获。想要避免它们。我们就需要用到try-catch。虽然RuntimeException的异常可以不使用try-catch进行处理,但是如果一旦发生异常,肯定会导致程序中断执行,所以,为了保证程序再出错后依然可以执行,我们最好使用try-catch的异常处理机制进行处理。1.3 什么样的异常要求用户一定要使用捕获处理?
只要是非RuntimeException异常类或者其子类的的异常都要声明捕捉。2.处理异常使你的程序更加健壮 题目5-2 2.1 截图你的提交结果(出现学号)
2.2 实验总结
这道题总体上来说不难,但是其中有两个地方需要特别注意。 第一处是读取数据,我采取的是整行读入,这时候读入的并不仅仅是数据还有一个回车,如果不将这个回车处理掉,就会出现如下的输出: 箭头所指的这行是我们所不需要的。 第二处是在捕获到异常之后的重新输入,一定要记得将非整型字符串从数组中去掉,否则它将占用数组的一个位置,导致最后一个整型字符串无法进入数组。3.throw与throws
题目5-3 3.1 截图你的提交结果(出现学号)**3.2 阅读Integer.parsetInt源代码,结合3.1说说抛出异常时需要传递给调用者一些什么信息?
需要让调用者知道编译器对这段代码抛出什么异常,抛出异常的原因。Integer.parsetInt源代码中,当传入的字符串为null、radix < Character.MIN_RADIX等时,就会抛出NumberFormatException异常,并提示抛出这个异常的原因。题目5-3中,当begin>end或者begin小于0,end大于arr.length时,就抛出IllegalArgumentException异常,并说明begin>end时抛出IllegalArgumentException异常是因为begin>end;end大于arr.length时抛出IllegalArgumentException异常是因为超出范围。4.函数题 题目4-1(多种异常的捕获) 4.1 截图你的提交结果(出现学号)
4.2 一个try块中如果可能抛出多种异常,捕获时需要注意些什么?
一个try块中如果可能抛出多种异常,捕获时需要注意这多种异常之间的继承关系,子类必须在父类之前先被捕捉,否则会发生错误。例如本题出现的三个异常:NumberFormatException、IllegalArgumentException、Exception,NumberFormatException继承自IllegalArgumentException,IllegalArgumentException继承自Exception,所以在编写catch块时要以NumberFormatException、IllegalArgumentException、Exception的顺序进行,这样才能保证程序不出错;或者是只需要一个Exception也可以。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 改正代码,让其可正常运行。注意:里面有多个方法均可能抛出异常
byte[] content = null; try{ FileInputStream fis = new FileInputStream("testfis.txt"); }catch (IOException e) { // TODO: handle exception System.out.println(e); } try{ int bytesAvailabe = fis.available();//获得该文件可用的字节数 }catch (IOException e) { // TODO: handle exception System.out.println(e); } try { if(bytesAvailabe>0){ content = new byte[bytesAvailabe];//创建可容纳文件大小的数组 fis.read(content);//将文件内容读入数组 } } catch (Exception e) { // TODO: handle exception System.out.println(e); }finally { if(fis != null) fis.close(); } System.out.println(Arrays.toString(content));
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));//打印数组内容 }
6.重点考核:使用异常改进你的购物车系统(未提交,得分不超过6分) 举至少两个例子说明你是如何使用异常机制让你的程序变得更健壮。 说明要包含2个部分:1. 问题说明(哪里会碰到异常)。2.解决方案(关键代码)
在购买商品的过程中可能会出现输入的数字不是我们商品列表中的商品编号的情况或者输入的需要购买的商品个数为负数的情况下,我就让它抛出IllegalArgumentException异常,并且直接退出重新进入,,但是这样设定起来购买的过程就会变得比较繁琐,重复的操作会变多,总体改下来感觉不太好,目前还在考虑其它的方法。
input.print("输入商品编号查看商品"); int i = input.nextInt(); try{ switch (i) { case 0: break; default: Goods goods = allGoods.getGoodsList().get(i - 1).display(); }catch(IllegalArgumentException e){ System.out.println(e); break; } input.print("输入1加入购物车"); try{ switch (input.nextInt()) { case 1: input.print("请输入购买商品的个数:"); ShoppingCart().add(ShoppingCart().new ShoppingList(goods, input.nextInt())); break; }catch(IllegalArgumentException e){ System.out.println(e); break; } break; }
8.选做:课外练习 JavaTutorial中Questions and Exercises 练习总结
1.Is the following code legal?try { } finally { }
在异常处理机制try-catch-finally中,捕获异常try是必须要有的,但是如果我们捕获到了异常却不做处理的话,那么catch块就可以被省略,finally块中则可能是进行资源的清理工作,如关闭文件等操作。
2.What exception types can be caught by the following handler?
catch (Exception e) { }
What is wrong with using this type of exception handler?
这样能够catch到所有的异常,因为Exception是所有异常的父类。这样固然能够捕获到异常但是,我们却失去了被抛出的异常类型这一信息,这样使我们无从通过代码知道具体的异常,可能会降低我们的效率。 3.Is there anything wrong with the following exception handler as written? Will this code compile?try {} catch (Exception e) { } catch (ArithmeticException a) { }
这段程序不能通过编译,原因是,第一个catch块已经捕获所有的异常,包括算术异常,所以第二个catch块根本无法到达,还会导致编译出错。如果要通过编译,只需将两个catch块的顺序交换。
4.Match each situation in the first list with an item in the second list.
a.int[] A; A[0] = 0; b.The JVM starts running your program, but the JVM can't find the Java platform classes. (The Java platform classes reside in classes.zip or rt.jar.) c.A program is reading a stream and reaches the end of stream marker. d.Before closing the stream and after reaching the end of stream marker, a program tries to read the stream again. 1.(b)error 2.(d)checked exception 3.(a)compile error 4.(c)no exception3. 码云上代码提交记录及PTA实验总结
题目集:jmu-Java-05-集合 3.1. 码云代码提交记录 在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图