1. 本章学习总结
2. 书面作业
本次PTA作业题集异常
1.常用异常题目5-1
-
1.1 截图你的提交结果(出现学号)
-
1.2 自己以前编写的代码中经常出现什么异常、需要捕获吗(为什么)?应如何避免?
①除0异常、数组越界、文件找不到...
②之前学习的C语言,没有异常这一说,只是程序出错后在出错的地方进行改进;在Java中,继承RuntimeException异常的不一定要捕获,但是继承Exception的异常都需要捕获。
③有些异常,像RuntimeException在程序中是完全可以避免的,比如数组的越界,只要在程序做个判断,如果访问的数组元素下标和数组的长度作一下比较就知道会不会越界了,再比如空指针异常,如果访问对象是判断一下对象是否为空就可以了。 -
1.3 什么样的异常要求用户一定要使用捕获处理??
之前提到的凡是直接继承自Exception的异常都需要捕获处理。
2.处理异常使你的程序更加健壮题目5-2
-
2.1 截图你的提交结果(出现学号)
-
2.2 实验总结
本题主要是对输入的数x[i] = Integer.parseInt(inputInt);
判断是否需要使用异常机制处理异常输入,剔除出现异常的数,再进行Arrays.toString输出,其他就没什么好说的。
3.throw与throws题目5-3
-
3.1 截图你的提交结果(出现学号)
-
3.2 阅读Integer.parsetInt源代码,结合3.1说说抛出异常时需要传递给调用者一些什么信息?
public static int parseInt(String s) throws NumberFormatException {
return parseInt(s,10);
}
public static int parseUnsignedInt(String s, int radix)
throws NumberFormatException {
if (s == null) {
throw new NumberFormatException("null");
}
int len = s.length();
if (len > 0) {
char firstChar = s.charAt(0);
if (firstChar == '-') {
throw new
NumberFormatException(String.format("Illegal leading minus sign " +
"on unsigned string %s.", s));
}
}
结合源代码,以及题目5-3我们发现,抛出异常时,需要传递给用户具体哪方面出现了问题;
比如:要求begin < end,否则抛出相应的异常(IllegalArgumentException`)。出现异常时,抛出throw new IllegalArgumentException("begin:"+begin+" >= "+"end:"+end);
提示用户begin要大于等于end。
4.函数题题目4-1(多种异常的捕获)
-
4.1 截图你的提交结果(出现学号)
-
4.2 一个try块中如果可能抛出多种异常,捕获时需要注意些什么?
一段代码可能会抛出多个异常,需要写多个catch子句来捕获;比如:函数题4-1中一个try,抛出多种异常,有用到多个catch。(代码如下)
try {
if (choice.equals("number"))
throw new NumberFormatException();
else if (choice.equals("illegal")) {
throw new IllegalArgumentException();
} else if (choice.equals("except")) {
throw new Exception();
} else
break;
} catch(NumberFormatException e) {
} catch(IllegalArgumentException e) {
} catch(Exception e) {
}
}
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 改正代码,让其可正常运行。注1:里面有多个方法均可能抛出异常。注2:要使用finally关闭资源。
修改后的代码:
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);// 将文件内容读入数组
}
System.out.println(Arrays.toString(content));// 打印数组内容
} catch(IOException e) {
System.out.println(e);
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
System.out.println(e);
}
}
}
}
按照eclipse提示,我们知道了构造FileInputStream方法需要抛出FileNotFoundException异常,所以添加了throws,FileInputStream的available()方法会抛出IOException异常,查阅jdk文档
发现:FileNotFoundException是IOException的子类;
再看,FileInputStream的read()方法也会抛出IOException异常。
- 5.2 使用Java7中的try-with-resources来改写上述代码实现自动关闭资源.
用try-with-resources实现自动关闭资源,只需将需要关闭的内容放入try中。
格式:
try( ) {
}catch(){
}
所以上述自动关闭资源的代码如下:
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));// 打印数组内容
} catch(IOException e) {
System.out.println(e);
}
System.out.println(Arrays.toString(content));//打印数组内容
6.重点考核:使用异常改进你的购物车系统(未提交,得分不超过6分)
举至少两个例子说明你是如何使用异常处理机制让你的程序变得更健壮。说明要包含2个部分:1. 问题说明(哪里会碰到异常)。2.解决方案(关键代码)
1、商品选购好后,用文件存放商品信息,那么在购物车结算的时候需要读取文件的信息,进行结算,这里就会碰到异常(文件不存在、获取的文件内容有问题、关闭资源的问题......)
2、解决方案(参照题目5关于文件异常的解决):
//关键代码处理上述异常
FileInputStream shop= null;
try(FileInputStream shop = new FileInputStream("shoppingcart.txt");) {
int bytesAvailabe = shop.available();
if (bytesAvailabe > 0) {
content = new byte[bytesAvailabe];
shop.read(content);
}
}catch(FileNotFoundException e){
System.out.println(e);
}
catch(IOException e){
System.out.println(e);
}
3. 码云上代码提交记录
题目集:异常
3.1. 码云代码提交记录
在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图