1. 本周学习总结

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

2. 书面作业

本次PTA作业题集 异常

1. 常用异常

结合题集题目7-1回答

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

常见的异常:

  • 访问数组的异常:ArrayIndexOutOfBoundsException
  • 空指针异常:NullPointerException
  • 类型转换异常:ClassCastException
  • 格式化异常:NumberFormatException

无需捕获,因为以上异常均继承RuntimeException,属于Unchecked Exception类型异常。要想避免这些就需要我们在编写代码时候谨慎一些,注意边界,还有空指针,类型转换的问题。

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

Answer:属于Checked Exception类型异常一定需要使用捕获处理。

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

题集题目7-2

2.1 实验总结。并回答:怎么样才能让你的程序更加健壮?

实验总结:本题就是用到了Integer integer = Integer.parseInt(sc.next());,由于输入的可能是字符型也可能是整型,所以用这句话来进行处理输入。并且当运行不发生异常时候才进行i++。

for (int i = 0; i <n ;) {
try {
Integer a = Integer.parseInt(sc.next());
arr[i] = a;
i++;
}catch (NumberFormatException e{
System.out.println(e);
}
}

Answer:在用Integer.parseInt(String)方法,输入变得多样性,使用异常处理输入机制try-catch,让程序变得更健壮。

3. throw与throws

题集题目7-3

阅读Integer.parsetInt源代码

3.1 Integer.parsetInt一开始就有大量的抛出异常的代码,这种做法有什么好处?

源代码

 public static int parseInt(String s) throws NumberFormatException {
return parseInt(s,10);
}
public static int parseInt(String s, int radix)
throws NumberFormatException
{
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");
} int result = 0;
boolean negative = false;
int i = 0, len = s.length();
int limit = -Integer.MAX_VALUE;
int multmin;
int digit; if (len > 0) {
char firstChar = s.charAt(0);
if (firstChar < '0') { // Possible leading "+" or "-"
if (firstChar == '-') {
negative = true;
limit = Integer.MIN_VALUE;
} else if (firstChar != '+')
throw NumberFormatException.forInputString(s); if (len == 1) // Cannot have lone "+" or "-"
throw NumberFormatException.forInputString(s);
i++;
}
multmin = limit / radix;
while (i < len) {
// Accumulating negatively avoids surprises near MAX_VALUE
digit = Character.digit(s.charAt(i++),radix);
if (digit < 0) {
throw NumberFormatException.forInputString(s);
}
if (result < multmin) {
throw NumberFormatException.forInputString(s);
}
result *= radix;
if (result < limit + digit) {
throw NumberFormatException.forInputString(s);
}
result -= digit;
}
} else {
throw NumberFormatException.forInputString(s);
}
return negative ? result : -result;
}

好处:抛出的都是NumberFormatException异常,可以让使用者知道自己产生异常的原因,原因分为以下几点:

  1. s为空
  2. 输入基数小于Character. MIN_RADIX = 2,或大于Character.MAX_RADIX = 36
  3. 第一个字符不是数字或‘+‘或’-‘
  4. 仅有一个+或一个-
  5. 在后面出现了不是数字
  6. 超过极值等

3.2 结合自己编写的程序与3.1,分析自己编写的方法抛出异常时一般需要传递给调用者一些什么信息?

Answer:本题中,抛出的都是IllegalArgumentException异常,需要传递给调用者信息是异常的原因:

  1. begin必须小于end
  2. begin不得小于0
  3. end不得大于arr.length

4. 用异常改进ArrayIntegerStack

题集题目6-3

4.1 结合6-3代码,回答使用抛出异常的方式代表程序运行时出错有什么好处?比单纯的返回错误值,有何优点?

Answer:使用抛出异常的方式程序运行时出错会直接抛出异常,直接形成断点,程序终止,方便进行代码的修正,若仅单纯返回错误值,就无法直接找到出错的地方了。因此可以说使用抛出异常的方式可以更直观的知道错误并进行代码的错误修改。

例如:

  if(capacity == top){
throw new FullStackException();
}
if(this.empty()){
throw new EmptyStackException();
}
  if(this.empty()){
throw new EmptyStackException();

4.2 什么时候该使用throw关键字?

Answer:首先要认识throw是用来抛出异常对象的,throw语句是放在方法体内的,是自己定义的,给一个条件想抛就抛。那么说,使用throw时候,应该是明确了要抛异常的地方以及要抛出的异常类型。

4.3 如果一个方法内部的内码抛出的是RuntimeException类型的异常,那么方法声明是否应该使用throws关键字,如果使用throws关键字声明该方法抛出的异常,能给我们带来什么好处吗?

Answer:RuntimeException类型的异常没有硬性要求使用throws关键字声明,throws关键字表示该方法可能抛出异常,如果使用throws关键字声明该方法抛出的异常,就可以无需try-catch处理,直接中止运行程序。

5. 函数题-多种异常的捕获

题集题目6-1

5.1 结合6-1代码,回答:一个try块中如果可能抛出多种异常,且异常之间可能有继承关系,捕获时需要注意些什么?

Answer:我觉得需要注意捕获的顺序。被继承的应该写在继承的后面。

5.2 一个try块中如果可能抛出多种异常,使用Java8的多重异常捕获语法需要注意些什么?

Answer:应该注意子类异常必须catch在其任何父类之前,否则就永远无法catch到子类,准确来说,子类捕获到的信息更为精准。

  1. 为如下代码加上异常处理
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));//打印数组内容

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

改正代码:

public class MainTest {
public static void main(String[] args) {
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);//将文件内容读入数组
}
}catch (FileNotFoundException e){
System.out.println(e); }catch (IOException e){
System.out.println(e); }
finally {
try {
fis.close();
}catch (Exception e){
System.out.println(e);
}
}
System.out.println(Arrays.toString(content));//打印数组内容
}
}

运行结果:

6.2 结束处理异常和使用finally关闭资源需要注意一些什么?

Answer:由于finally是不论是否被捕获都要执行的,但是finally

内部的执行语句也可能会有异常,就需要在finally内部也进行try-catch。

6.3 使用Java7中的try-with-resources来改写上述代码实现自动关闭资源。简述这种方法有何好处?

Answer:

  • 改写
public class MainTest {
public static void main(String[] args) {
byte[] content = null;
try(FileInputStream fis = new FileInputStream("testfis.txt")){
int bytesAvailabe = fis.available();//获得该文件可用的字节数
if(bytesAvailabe>0){
content = new byte[bytesAvailabe];//创建可容纳文件大小的数组
fis.read(content);//将文件内容读入数组
}
}catch(Exception e){
System.out.println(e);
} System.out.println(Arrays.toString(content));
}
}
  • 好处:首先认识try-with-resource语句确保资源被关闭,自动调用了close函数,因此可以说不管try语句块是否能够正常运行,最终资源都将会被关闭,这相比之前使用的finally内部写try-catch语句块来实现资源关闭就比较方便多了。

7. 面向对象设计作业(分组完成,每组不超过3个同学)

登录lib.jmu.edu.cn,对图书进行搜索。然后登录图书馆信息系统,查看我的图书馆。如果让你实现一个图书借阅系统,尝试使用面向对象建模。

7.1 该系统的使用者有谁?

Answer:学生、教职工和管理员

7.2 主要功能模块(不要太多)

学生/教职工

  1. 登录
  2. 挂失
  3. 查询书
  4. 查看当前借阅信息
  5. 借阅书书
  6. 归还书本
  7. 退出系统

管理员

  1. 查询图书信息
  2. 增加新增图书
  3. 删除下架图书

7.3 该系统的主要的类设计及类图(可用)

Answer:目前才设计了几个类(如图)

7.4 你准备如何存储图书信息、解决信息、读者信息等

Answer:我目前的想法是用文件来存储图书借阅的信息以及读者的信息。但是具体的用法我还不是很清晰。

8. 选做:使用异常改进你的购物车系统

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

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

一个例子:

  • 问题说明:输入要添加到购物车的货品序号时候可能输入的不是数字
  • 解决方案:
	try{
int number = Integer.parseInt(sc.next());
if (number == 0) {
break;
} else {
shoppingcart.addSnack(snacks1[number - 1]);
println("添加购物车成功!\n继续添加输入数字,否则输入0结束!");
}
}catch (Exception e){
System.out.println(e);
}

3.码云及PTA

题目集:异常

3.1. 码云代码提交记录

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

3.2 截图PTA题集完成情况图

需要有两张图(1. 排名图。2.PTA提交列表图)

3.3 统计本周完成的代码量

需要将每周的代码统计情况融合到一张表中。

周次 总代码量 新增代码量 总文件数 新增文件数
1 374 374 5 5
2 889 515 15 10
3 1417 528 22 7
4 1838 421 27 5
6 2608 770 38 11
7 3270 662 48 10
8 4068 798 52 4
9 4543 475 60 8
10 4988 445 65 5
11 5421 433 72 7

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

  1. 2018面向对象程序设计(Java)第10周学习指导及要求

    2018面向对象程序设计(Java)第10周学习指导及要求(2018.11.1-2018.11.4)  学习目标 理解泛型概念: 掌握泛型类的定义与使用: 掌握泛型方法的声明与使用: 掌握泛型接口的定 ...

  2. 面向对象程序设计(JAVA) 第10周学习指导及要求

    2019面向对象程序设计(Java)第10周学习指导及要求 (2019.11.1-2019.11.4)   学习目标 1.掌握java异常处理技术: 2.了解断言的用法: 3.了解日志的用途: 4.掌 ...

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

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

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

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

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

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

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

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

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

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

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

    20145236 <Java程序设计>第九周学习总结 教材学习内容总结 第十六章 整合数据库 JDBC简介 1.JDBC是java联机数据库的标准规范.它定义了一组标准类与接口,标准API ...

  9. 20155304田宜楠2006-2007-2 《Java程序设计》第一周学习总结

    20155304田宜楠2006-2007-2 <Java程序设计>第一周学习总结 教材学习内容总结 - 浏览教材,根据自己的理解每章提出一个问题 第一章 除了书上提到的开发工具还有什么适合 ...

  10. 20155304田宜楠 2006-2007-2 《Java程序设计》第二周学习总结

    20155304田宜楠 2006-2007-2 <Java程序设计>第二周学习总结 教材学习内容总结 一.类型与变量 1.类型 整数: 可细分为为short整数(占2字节),int整数(占 ...

随机推荐

  1. Winform开发框架之框架演化

    Winform开发框架方面的文章我介绍很多了,有宏观介绍,也有部分技术细节的交流,每次我希望能从不同角度,不同方面来介绍我的WInform开发框架,这些其实都是来源于客户的需求,真实的项目场景.本文主 ...

  2. 机器学习 之k-means和DBSCAN的区别

    目录 1.定义和区别(优缺点对比) 2.kmeans原理 3.DBSCAN原理 1.定义和区别(优缺点对比) 聚类分为:基于划分.层次.密度.图形和模型五大类: 均值聚类k-means是基于划分的聚类 ...

  3. linux常用网络命令ping和arping

    linux常用网络命令ping和arping ping 向目标主机发送icmp请求包 常用来测试当前主机与目标主机网络连接状况 常见选项 -c              设置发包的个数 -s      ...

  4. hdu 1542 Atlantis (线段树扫描线)

    大意: 求矩形面积并. 枚举$x$坐标, 线段树维护$[y_1,y_2]$内的边是否被覆盖, 线段树维护边时需要将每条边挂在左端点上. #include <iostream> #inclu ...

  5. 『计算机视觉』Mask-RCNN_推断网络其二:基于ReNet101的FPN共享网络暨TensorFlow和Keras交互简介

    零.参考资料 有关FPN的介绍见『计算机视觉』FPN特征金字塔网络. 网络构架部分代码见Mask_RCNN/mrcnn/model.py中class MaskRCNN的build方法的"in ...

  6. Buffer和Stream

    Buffer JavaScript 语言自身只有字符串数据类型,没有二进制数据类型.但在处理像TCP流或文件流时,必须使用到二进制数据. 因此在 Node.js中,定义了一个 Buffer 类,该类用 ...

  7. php入门知识储备

    知识结构 开发环境 能够搭建开发环境(一键安装包也算) 知道开发环境中包含哪些软件 知道每种软件的用处 知道每种软件的配置文件(配置项可以慢慢体会) HTML 知道什么是标签.属性 了解基本的HTML ...

  8. Oracle 12c新特性之——TABLE ACCESS BY INDEX ROWID BATCHED

    Oracle12c开始,我们在获取SQL语句的执行计划时,也会经常看到"TABLE ACCESS BY INDEX ROWID BATCHED"操作,那么,这个操作到底是什么意思呢 ...

  9. 使用Swagger2构建强大的RESTful API文档(1)(二十二)

    由于Spring Boot能够快速开发.便捷部署等特性,相信有很大一部分Spring Boot的用户会用来构建RESTful API.而我们构建RESTful API的目的通常都是由于多终端的原因,这 ...

  10. 把旧系统迁移到.Net Core 2.0 日记(2) - 依赖注入/日志NLog

    Net Core 大量使用依赖注入(Dependency Inject), 打个比方,我们常用的日志组件有Log4Net,NLog等等. 如果我们要随时替换日志组件,那么代码中就不能直接引用某个组件的 ...