1. 本周学习总结
1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容。
2. 书面作业
本次PTA作业题集异常
常用异常
题目5-1
1.1 截图你的提交结果(出现学号)
1.2 自己以前编写的代码中经常出现什么异常、需要捕获吗(为什么)?应如何避免?
答:经常出现ArrayIndexOutOfBoundsException、 NullPointerException、ClassCastException,这些异常不需要捕获处理,因为这些异常都是RuntimeException的子类。ArrayIndexOutOfBoundsException异常的避免需要用检测是否下标是否越界来避免,NullPointerException用检测对象是否为空来避免异常。
1.3 什么样的异常要求用户一定要使用捕获处理?
答:除了Error与RuntimeException及其子类以外的异常都是Checked Exception,即都需要捕获处理
处理异常使你的程序更加健壮
题目5-2
2.1 截图你的提交结果(出现学号)
2.2 实验总结
答:这题是在课堂上完成的,主要注意的是try-catch放的位置,并且有其中一个输错不能影响后面数据的输入。
3.throw与throws
题目5-3
3.1 截图你的提交结果(出现学号)
3.2 阅读Integer.parsetInt源代码,结合3.1说说抛出异常时需要传递给调用者一些什么信息?
if (s == null) {
throw new NumberFormatException("null");
}//要转换的对象为空时,传递给调用者说该对象为空,为NumberFormatException异常
if (radix < Character.MIN_RADIX) {
throw new NumberFormatException("radix " + radix +
" less than Character.MIN_RADIX");
}//转换的对象小于MIN_VALUE(int型最小值),则告诉调用者该对象小于该方法能转换对象的最小值,为NumberFormatException异常
if (radix > Character.MAX_RADIX) {
throw new NumberFormatException("radix " + radix +
" greater than Character.MAX_RADIX");
}//转换的对象小于MAX_RADIX(int型最大值),则告诉调用者该对象小于该方法能转换对象的最大值,为NumberFormatException异常
4.函数题
题目4-1(多种异常的捕获)
3.1 截图你的提交结果(出现学号)
3.2 一个try块中如果可能抛出多种异常,捕获时需要注意些什么?
答:答:子类异常必须放在父类异常前面,catch块中的异常不得有继承关系
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");
} catch (FileNotFoundException e) {//在改正代码之前,会出现“unhandle exception type FileNotFoundException”的错误,因此在此处加了try-catch捕获异常
// TODO Auto-generated catch block
System.out.println(e);
}
int bytesAvailabe = 0;//未改正之前提示未初始化的错误,因此bytesAvailabe要设置初始化
try {
bytesAvailabe = fis.available();
} catch (IOException e) {//捕获IOException、NullPointerException异常
// TODO Auto-generated catch block
System.out.println(e);
}catch(NullPointerException e){
System.out.println(e);
}
if(bytesAvailabe>0){
content = new byte[bytesAvailabe];//创建可容纳文件大小的数组
try {
fis.read(content);
} catch (IOException e) {//捕获IOException异常
// TODO Auto-generated catch block
System.out.println(e);
}finally{
if(fis!=null){
try {
fis.close();//finally关闭资源,但是如果就只是fis.close仍然会出现IOException未被处理的异常,因此根据提示仍然要加入try- catch捕获异常
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println(e);
}//将文件内容读入数组
}
}
System.out.println(Arrays.toString(content));//打印数组内容
}
运行结果
5.2 使用Java7中的try-with-resources来改写上述代码实现自动关闭资源.
try(Scanner sc=new Scanner(new FileInputStream("testfis.txt"))) {
fis = new FileInputStream("testfis.txt");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
System.out.println(e);
}
6.重点考核:使用异常改进你的购物车系统(未提交,得分不超过6分)
举至少两个例子说明你是如何使用异常处理机制让你的程序变得更健壮。
说明要包含2个部分:1. 问题说明(哪里会碰到异常)。2.解决方案(关键代码)
//当输入的用户名为空时会出现 NullPointerException异常
public class Perinformation {
String username;
String password;
public Perinformation(String username,String password){
if(username.length()==0){
throw new NullPointerException("用户名不能为空~");
}
this.username=username;
this.password=password;
}
public Perinformation(){
}
public String toString() {
return "Perinformation [username=" + username + ", password=" + password + "]";
}
}
//用文件存储购物车信息,当打开文件的文件无法找到时会显示FileNotFoundException 异常
Goods[] book=new Books[2];
FileInputStream fileInputStream = null;
Scanner sc = null;
try {
fileInputStream = new FileInputStream("Goods.txt");
sc = new Scanner(fileInputStream);
if(sc.hasNextLine()) {
book[0]=new Books(sc.nextLine(),sc.nextDouble(),sc.nextLine());
book[1]=new Books(sc.nextLine(),sc.nextDouble(),sc.nextLine());
}
}catch(FileNotFoundException e) {
e.printStackTrace();
}finally{
if(sc==null)
sc.close();
}
3. 码云上代码提交记录
3.1. 码云代码提交记录
在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图