1. 本周学习总结
1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容。
异常处理机制:
-
发生错误生成异常对象
-
JVM发现异常对象并寻找相应的代码进行处理
-
本质:将程序控制权从错误产生的地方-->能够处理这种情况的地方
异常机制的好处:
- 出错信息可以很详细(以对象形式包装)
- 让用户有效地发现错误
- 出错代码与错误处理相分离
2. 书面作业
——本次PTA作业题集异常
1. 常用异常__题目5-1
1.1 截图你的提交结果(出现学号)
1.2 自己以前编写的代码中经常出现什么异常、需要捕获吗(为什么)?应如何避免?
答:
- 出现的异常:空指针(NullPointerException)、数字格式转化异常(NumberFormatException)......
- 这两个异常都不需要捕获,属于RuntimeException(运行时异常),顺利通过编译,Unchecked Exception;
- 避免:比如空指针,在写程序时,注意判断是否为空。
1.3 什么样的异常要求用户一定要使用捕获处理?
答:除了Exception中的RuntimeException(运行异常)以外都一定要使用捕获处理,即可以被处理(修复)的错误。
2. 处理异常使你的程序更加健壮__题目5-2
2.1 截图你的提交结果(出现学号)
2.2 实验总结
我的总结:相对来说比较简单,要注意的是重新输入那个提示异常的下标位置,用i--
,这个地方考虑的过多了。
3. throw与throws__题目5-3
3.1 截图你的提交结果(出现学号)
3.2 阅读Integer.parsetInt源代码,结合3.1说说抛出异常时需要传递给调用者一些什么信息?
答:
- 源代码:
- 抛出异常时需要传递给调用者的信息:
(1)parseInt将字符串转换成10进制数;
(2)字符串为空指针,抛出 NumberFormatException;
(3)转换的数字,进制如果小于最小的进制(public static final int MIN_RADIX = 2;
)或者大于最大的进制(public static final int MAX_RADIX = 36;
),抛出NumberFormatException;
(4)第一个字符可能是有+或者-,如果只有第一个字符,抛出NumberFormatException;
(5)使用了Character.digit()
方法,可以转换为指定数字的字符则返回该数字,否则返回-1;
(6)溢出情况的判断(数字小于0、结果小于限定界限即最小值、结果小于界限加上最后一位数字),抛出NumberFormatException;
(7)字符串为空,抛出NumberFormatException;
(8)最后一句判断,若是正数则返回相反数。
4. 函数题__题目4-1(多种异常的捕获)
4.1 截图你的提交结果(出现学号)
4.2 一个try块中如果可能抛出多种异常,捕获时需要注意些什么?
答:
- 本题来说,每一个异常对应操作不同,应该分别写catch块,并且子类应该写在父类之前,防止出现找不到异常而编译错误。
- 如果异常对应的操作相同,可以用父类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 改正代码,让其可正常运行。注意:里面有多个方法均可能抛出异常
我的代码:
- 根据提示的第一种修改——throws:
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Arrays;
public class Q5 {
public static void main(String[] args) throws IOException {
byte[] content = null;
@SuppressWarnings("resource")
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));// 打印数组内容
}
}
- 根据提示的第二种修改——用finally关闭资源:
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Arrays;
public class SQ5_2 {
public static void main(String[] args) {
byte[] content = null;
FileInputStream fis = null;
try {
fis = new FileInputStream("testfis.txt");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
int bytesAvailabe = 0;
try {
bytesAvailabe = fis.available();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} // 获得该文件可用的字节数
if (bytesAvailabe > 0) {
content = new byte[bytesAvailabe];// 创建可容纳文件大小的数组
try {
fis.read(content);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} // 将文件内容读入数组
}
System.out.println(Arrays.toString(content));// 打印数组内容
}
}
5.2 如何使用Java7中的try-with-resources来改写上述代码实现自动关闭资源?
我的代码:
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Arrays;
public class SQ5_3 {
public static void main(String[] args) throws IOException {
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.解决方案(关键代码)
6.1 问题说明
答:
(1)该输入数字时,输入非数学,可能出现NumberFormatException;
(2)添加商品到购物车时数量为0,抛出自己设定的异常。
6.2 解决方案
答:
(1)
try{
for (i = 0; i < goodsnum; i++) {
if(addinputtext.getText().equals(goods[i].getName())){
goods[i].number+=Integer.parseInt(addnumbertext.getText());//这句可能
list.add(goods[i]);
JOptionPane.showMessageDialog(null,"添加成功!");
break;
}
}
}catch(NumberFormatException e){
JOptionPane.showMessageDialog(null,"输入的数量不符合相应类型!");
}
(2)
- 自定义异常:
class CannotAddException extends Exception {
public CannotbeAddToCartException(String str){
super(str);
}
}
- 在方法中抛出异常:
public void addCart(Stuff goods1) throws Exception{
if(goods1.Num==0){
throw new CannotAddException("注意:商品数量为0");
}
}
7. 选做:JavaFX入门
——如果未完成作业1、2的先完成1、2。贴图展示。如果已完成作业1、2的请完成作业3。内有代码,可在其上进行适当的改造。建议按照里面的教程,从头到尾自己搭建
作业1
作业2
(原图)
- 新建:
- 编辑:
- 删除:
8. 选做:课外练习
——JavaTutorial中Questions and Exercises
练习总结
Questions中的问题都是基础,但是第一题就错了,以为try-catch一定要搭配使用,没有自己敲一下代码,也没有完全理解异常;然后第二题理解到异常也需要对症下药,要捕捉自己认为有价值的异常;第三题、第四题做对了。
Exercises中第一题,可以说照写入的样子写一个读取吧,注意一下文件无法找到的异常;第二题就是要写上捕捉异常的方法并且让程序编译成功。
3. 码云上代码提交记录——题目集:异常
3.1. 码云代码提交记录
——在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图
选做:4. 课外阅读
任选下面一篇文章阅读,列举出几点自己能理解的异常处理最佳实践。
- Best Practices for Exception Handling
- Exception-Handling Antipatterns Blog
- The exceptions debate
答:
- 关于The exceptions debate的阅读:(待续)
(1)程序中编写的代码一般来说只抛出运行时异常(RunTimeException)。
(2)尽量在在指定情况下抛出异常,防止造成预留空间的浪费。