第09周-异常

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)尽量在在指定情况下抛出异常,防止造成预留空间的浪费。
posted @ 2017-04-22 09:21  wuht  阅读(241)  评论(0编辑  收藏  举报