1. 本周学习总结

2. 书面作业

Q1.常用异常

题目5-1

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

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

Ans:

  1. JAVA中的常见异常:
  2. ArrayIndexOutOfBoundsException 数组越界
  3. NullPointerException 空指针
  4. ClassCastException 转换不兼容(强制转换)
  5. FileNotFoundException 系统找不到指定路径
  6. IllegalArgumentException 非法参数

平时编程比较常见的异常是主要是ArrayIndexOutOfBoundsException(数组越界)、NullPointerException(空指针)和ClassCastException(强制转换异常)。

而这些异常都属于RuntimeException。对RuntimeException,我们有如下定义:

  • 一般是对API的误用,无需try-catch
  • 程序员应改进代码,比如不让数组下标越界
  • 属于Unchecked Exception

    这个定义解决了这个问题,无需捕获(try-catch),通过改进代码避免

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

Ans:

在Java的异常继承架构中,有如下异常:

  • Error:属于严重错误,程序员基本无法处理。
  • Exception:其中主要分为两类

    ①RuntimeException:在1.2中已经提到,属于Unchecked Exception,无需try-catch。

    ②Exception其他子类:属于Checked Exception,我们需要弄懂这个错误,必须try-catch处理。

    因此在Exception的其他子类中,我们需要捕获。

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

题目5-2

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

2.2 实验总结

根据题目要求,这题我们需要try-catch数组中的非整型异常,即NumberFormatException,使用try-catch对输入数组元素放入数组相关程序短进行NumberFormatException捕获即可。

Q3.throw与throws

题目5-3

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



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

Ans:

贴出Integer.parsetInt的源代码,并截图对应注释:

  1. public static int parseInt(String s, int radix)
  2. throws NumberFormatException
  3. {
  4. /*
  5. * WARNING: This method may be invoked early during VM initialization
  6. * before IntegerCache is initialized. Care must be taken to not use
  7. * the valueOf method.
  8. */
  9. if (s == null) {
  10. throw new NumberFormatException("null");
  11. }
  12. if (radix < Character.MIN_RADIX) {
  13. throw new NumberFormatException("radix " + radix +
  14. " less than Character.MIN_RADIX");
  15. }
  16. if (radix > Character.MAX_RADIX) {
  17. throw new NumberFormatException("radix " + radix +
  18. " greater than Character.MAX_RADIX");
  19. }
  20. int result = 0;
  21. boolean negative = false;
  22. int i = 0, len = s.length();
  23. int limit = -Integer.MAX_VALUE;
  24. int multmin;
  25. int digit;
  26. if (len > 0) {
  27. char firstChar = s.charAt(0);
  28. if (firstChar < '0') { // Possible leading "+" or "-"
  29. if (firstChar == '-') {
  30. negative = true;
  31. limit = Integer.MIN_VALUE;
  32. } else if (firstChar != '+')
  33. throw NumberFormatException.forInputString(s);
  34. if (len == 1) // Cannot have lone "+" or "-"
  35. throw NumberFormatException.forInputString(s);
  36. i++;
  37. }
  38. multmin = limit / radix;
  39. while (i < len) {
  40. // Accumulating negatively avoids surprises near MAX_VALUE
  41. digit = Character.digit(s.charAt(i++),radix);
  42. if (digit < 0) {
  43. throw NumberFormatException.forInputString(s);
  44. }
  45. if (result < multmin) {
  46. throw NumberFormatException.forInputString(s);
  47. }
  48. result *= radix;
  49. if (result < limit + digit) {
  50. throw NumberFormatException.forInputString(s);
  51. }
  52. result -= digit;
  53. }
  54. } else {
  55. throw NumberFormatException.forInputString(s);
  56. }
  57. return negative ? result : -result;
  58. }
  59. public static int parseInt(String s) throws NumberFormatException {
  60. return parseInt(s,10);
  61. }

对应注释

抛出异常时,应首先抛出给调用者异常,再抛出其原因,

我们以Integer.parsetInt方法及其源代码为例,

首先,Integer.parsetInt方法的主要作用是将字符串转化为整型数字,

那么,当我们输入的字符并非一个一个数字,而是字母或者符号时,就会产生导致Integer.parsetInt方法无法作用的异常,即第二题中出现过的NumberFormatException

那么此时就需要将其抛出。

再观察Integer.parsetInt的源代码,



此时抛出NumberFormatException这个异常,用户就清楚的知道自己刚才输入的并非整形数字,而是不符合要求的字符了。

Q4.函数题

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

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

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

Ans:

子类的异常要在父类异常前进行捕获,例如4.1,

若是父类Exception先于子类NumberFormatException和IllegalArgumentException被捕获,那么系统就会报错,产生编译错误。

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

  1. byte[] content = null;
  2. FileInputStream fis = new FileInputStream("testfis.txt");
  3. int bytesAvailabe = fis.available();//获得该文件可用的字节数
  4. if(bytesAvailabe>0){
  5. content = new byte[bytesAvailabe];//创建可容纳文件大小的数组
  6. fis.read(content);//将文件内容读入数组
  7. }
  8. System.out.println(Arrays.toString(content));//打印数组内容

5.1 改正代码,让其可正常运行。注1:里面有多个方法均可能抛出异常。注2:要使用finally关闭资源。

Ans:

题目所给代码无法正常运行,也就是说会报错,那么想要它正常运行,就需要弄清楚错在哪,因此我们直接复制粘贴题目所给代码,得到如下报错:



报错显示异常FileNotFoundException和IOException没有得到处理。

使用JDK文档对FileNotFoundException和IOException类进行了查询,惊奇的发现:



FileNotFoundException类是IOException类的子类,那么就是说在Main函数中throws IOException,即可抛出没有得到处理的所有异常。

因此,对程序做throws处理,得到

  1. import java.io.FileInputStream;
  2. import java.io.IOException;
  3. import java.util.*;
  4. public class Main {
  5. public static void main(String[] args)throws IOException {
  6. byte[] content = null;
  7. FileInputStream fis = new FileInputStream("testfis.txt");
  8. int bytesAvailabe = fis.available();// 获得该文件可用的字节数
  9. if (bytesAvailabe > 0) {
  10. content = new byte[bytesAvailabe];// 创建可容纳文件大小的数组
  11. fis.read(content);// 将文件内容读入数组
  12. }
  13. System.out.println(Arrays.toString(content));// 打印数组内容
  14. fis.close();
  15. }
  16. }

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

利用try-with-resources来改写上述代码实现自动关闭资源的办法:

Java7中提供了自动尝试关闭资源的语法,可将尝试自动关闭资源的对象生成写在try之后的圆括号中

  1. import java.io.FileInputStream;
  2. import java.io.IOException;
  3. import java.util.*;
  4. public class Main {
  5. public static void main(String[] args)throws IOException {
  6. byte[] content = null;
  7. try(FileInputStream fis = new FileInputStream("testfis.txt")){
  8. int bytesAvailabe = fis.available();// 获得该文件可用的字节数
  9. if (bytesAvailabe > 0) {
  10. content = new byte[bytesAvailabe];// 创建可容纳文件大小的数组
  11. fis.read(content);// 将文件内容读入数组
  12. }
  13. }
  14. catch(Exception e){
  15. System.out.println(e);
  16. }
  17. System.out.println(Arrays.toString(content));// 打印数组内容
  18. }
  19. }

Q6.重点考核:使用异常改进你的购物车系统

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

说明要包含2个部分:1. 问题说明(哪里会碰到异常)。2.解决方案(关键代码)

3. 码云上代码提交记录

3.1. 码云代码提交记录

在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图

201521123028 《Java程序设计》 第9周学习总结的更多相关文章

  1. 20145213《Java程序设计》第九周学习总结

    20145213<Java程序设计>第九周学习总结 教材学习总结 "五一"假期过得太快,就像龙卷风.没有一点点防备,就与Java博客撞个满怀.在这个普天同庆的节日里,根 ...

  2. 20145213《Java程序设计》第二周学习总结

    20145213<Java程序设计>第二周学习总结 教材学习内容总结 本周娄老师给的任务是学习教材的第三章--基础语法.其实我觉得还蛮轻松的,因为在翻开厚重的书本,一股熟悉的气息扑面而来, ...

  3. 20145213《Java程序设计》第一周学习总结

    20145213<Java程序设计>第一周学习总结 教材学习内容总结 期待了一个寒假,终于见识到了神秘的娄老师和他的Java课.虽说算不上金风玉露一相逢,没有胜却人间无数也是情理之中,但娄 ...

  4. 21045308刘昊阳 《Java程序设计》第九周学习总结

    21045308刘昊阳 <Java程序设计>第九周学习总结 教材学习内容总结 第16章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 数据库本身是个独立运行的应用程序 撰 ...

  5. 20145330孙文馨 《Java程序设计》第一周学习总结

    20145330孙文馨 <Java程序设计>第一周学习总结 教材学习内容总结 刚开始拿到这么厚一本书说没有压力是不可能的,开始从头看觉得很陌生进入不了状态,就稍微会有一点焦虑的感觉.于是就 ...

  6. 20145337 《Java程序设计》第九周学习总结

    20145337 <Java程序设计>第九周学习总结 教材学习内容总结 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 JDBC可以 ...

  7. 20145337 《Java程序设计》第二周学习总结

    20145337 <Java程序设计>第二周学习总结 教材学习内容总结 Java可分基本类型与类类型: 基本类型分整数(short.int.long).字节(byte).浮点数(float ...

  8. 20145218《Java程序设计》第一周学习总结

    20145218 <Java程序设计>第一周学习总结 教材学习内容总结 今天下午看了Java学习的视频,感觉很是新奇,之前觉得Java学起来是艰难枯燥的,但通过第一章的学习觉得如果自己可以 ...

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

    20145224 <Java程序设计>第九周学习总结 第十六章 整合数据库 JDBC入门 ·数据库本身是个独立运行的应用程序 ·撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的 ...

  10. 《Java程序设计》第二周学习总结

    20145224陈颢文<Java程序设计>第二周学习总结 教材学习内容总结 一.类型.变量与运算符 1.类型 整数: 可细分为为short整数(占2字节),int整数(占4字节),long ...

随机推荐

  1. iOS - Block底层解析

    Block是iOS开发中一种比较特殊的数据结构,它可以保存一段代码,在合适的地方再调用,具有语法简介.回调方便.编程思路清晰.执行效率高等优点,受到众多猿猿的喜爱.但是Block在使用过程中,如果对B ...

  2. Linux 日常使用小记

    一.Oracle VirtualBox安装Linux7.0全屏设置 1. 点击菜单栏 设备 –> 分配光驱 –> 选择一个虚拟光盘,找到VirtualBox安装目录下的VBoxGuestA ...

  3. Web.Config文件详解

    一).Web.Config是以XML文件规范存储,配置文件分为以下格式    1.配置节处理程序声明      特点: 位于配置文件的顶部,包含在<configSections>标志中.  ...

  4. Gate One

    运维堡垒机介绍: 运维堡垒机的理念起源于跳板机.2000年左右,高端行业用户为了对运维人员的远程登录进行集中管理,会在机房里部署跳板机.跳板机就是一台服务器,维护人员在维护过程中,首先要统一登录到这台 ...

  5. 关于CNoTrackObject

    CNoTrackObject,通过类名称就能大概猜到其意思:避免被跟踪的对象. 使用MFC开发的应用程序,new/delete都被重载,有专用的跟踪机制来检查内存泄漏. 由CNoTrackObject ...

  6. Java 图片处理解决方案:ImageMagick 快速入门

    一.ImageMagick介绍 ImageMagick是一个免费的创建.编辑.合成图片的软件,可以实现图片切割.颜色替换.图片缩略图.图片水印等各种效果.ImageMagick是免费开源软件,支持大多 ...

  7. JavaScript的8行代码搞定js文件引入问题

    单页面的操作,免不了会有各种jsp的嵌套问题,一个操作页面里面可能涉及到几十甚至上百个jsp页面. 平常我们对用到的js文件的引入,都会放到index的header里面.如图: 但是,让我们思考三个问 ...

  8. 创建springbootdemo后运行报MongoSocketOpenException错误解决方法

    在类SpringbootdemoApplication上右键Run as选择Spring Boot App后Console输出报错日志如下: com.mongodb.MongoSocketOpenEx ...

  9. MySQL使用聚合函数查询

    create table `t_grade` ( `id` int , `stuName` varchar (60), `course` varchar (60), `score` int ); in ...

  10. Django配置mysql

    我的环境为windows10+pyhton3.6+Django1.11.4 由于mysqldb不支持python3,所以django连接MySQL就不能再使用mysqldb了.故而选择了mysqlcl ...