201521123063 《Java程序设计》 第9周学习总结

1. 本周学习总结

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

2. 书面作业

本次PTA作业题集异常

常用异常

题目5-1

1.1 截图你的提交结果(出现学号)

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

答:涉及到数组的时候,容易产生数组越界;在进行强制转型时候会发生ClassCastException,还有空指针:NullPointerException 当输入的类型与预期的不符合时,会出现NumberFormatException,
这些异常不需要补获,一般在运行出现问题的时候,程序断掉了,才会去检查错误;为了减少程序崩溃,可以使用try...catch来补货异常,根据提醒进行修改

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

答:当类型为Checked Exception时需要捕获异常,而且除了Error与RuntimeException及其子类以外的异常都是Checked Exception

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

题目5-2

2.1 截图你的提交结果(出现学号)

2.2 实验总结

总结:在try中包含
int x=Integer.parseInt(scan.next());当输入的含有非数字的字符串,则抛出异常,用catch捕获之后,直接输出异常的信息,如果循环的话,变量需要自减1
在API文档中查看的结果如下:

throw与throws

题目5-3

3.1 截图你的提交结果(出现学号)

3.2 阅读Integer.parsetInt源代码,结合3.1说说抛出异常时需要传递给调用者一些什么信息?

源代码:
 public static int parseInt(String s) throws NumberFormatException {
        return parseInt(s,10);
 }
 抛出异常时,需要给调用者提供,异常的原因,异常的行数;

函数题

题目4-1(多种异常的捕获)

3.1 截图你的提交结果(出现学号)

3.2 一个try块中如果可能抛出多种异常,捕获时需要注意些什么?

答:捕获时,需要注意存在的继承关系,比如RuntimeException 是Exception的子类,如果Exception在其子类的前面,则优先被父类捕获
### 为以下代码加上异常处理


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

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(FileNotFoundException | SizeDetermineFailed | MemoryAllocateFailed | ReadFailed e){
    e.getStackTrace();
}finally{
    if (fis != null) {
        try {                     //考虑到关闭资源也有可能出错
             fis.close();
         } catch (IOException e) {
             e.printStackTrace();
         }
     }
}
System.out.println(Arrays.toString(content));//打印数组内容

5.2 使用Java7中的try-with-resources来改写上述代码实现自动关闭资源.

参考ppt上的代码;
StringBuilder builder =new SteingBuilder ();
try(Scanner scan=new Scanner(new FileInputStream("testfis.txt")){
    while(scan.HasNext()){
        builder.append(scan.nextLine());
        builder.append('\n');
    }
}
改写后:
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){
    e.printStackTrace();
}

System.out.println(Arrays.toString(content));

重点考核:使用异常改进你的购物车系统(未提交,得分不超过6分)
举至少两个例子说明你是如何使用异常处理机制让你的程序变得更健壮。
说明要包含2个部分:1. 问题说明(哪里会碰到异常)。2.解决方案(关键代码)

  • 在登录时候输入账号和密码,如果出现还未注册过的账号,会出现异常
改进:
try{
	if (Shopping.this.map.get(userInput.getText()).equals(s)) {
		new Menu().setVisible(true);
		Login.this.dispose();
	}
} catch(Exception e){
	JOptionPane.showMessageDialog(null, "您输入的账户名密码不正确");
}

运行结果:

  • 在输入添加数量的时候,如果出现非数字的,则会出现NumberFormat的异常,使程序崩溃
改进:
try{
	for (i = 0; i < 7; i++) {       //因为规定的商品最多有7种
	    if(addinputtext.getText().equals(g[i].getName())){
			g[i].number+=Integer.parseInt(addnumbertext.getText());
			list.add(g[i]);
			JOptionPane.showMessageDialog(null,"已添加");
		    break;
		}
	}
	if(i==7){
		JOptionPane.showMessageDialog(null,"添加的书名不存在!");
	}
}catch(Exception e){
	JOptionPane.showMessageDialog(null,"输入的数量不正确");
}

运行结果:

选做:JavaFX入门

如果未完成作业1、2的先完成1、2。贴图展示。如果已完成作业1、2的请完成作业3。内有代码,可在其上进行适当的改造。建议按照里面的教程,从头到尾自己搭建。

  • 第一部分

  • 第二部分

  • 第三部分

选做:课外阅读
JavaTutorial中Questions and Exercises
写出读后感

Question1:

是合法的,finally的块都会被执行

Question2:

当程序出现Exception及其子类的异常情况时,则会被捕获,影响程序的效率

Question3:

不能通过编译,因为ArithmeticException继承Exception,而且Exception在前,所以会被优先捕获,不会运行到下面的代码

Question4:

a 未被初始化,会发生编译错误
b 错误
c 需要用异常来捕获,
d checked exception

Excercise1
Excercise2

需要添加异常的捕获,可能会遇到的异常:FileNotFoundException,IOException

总结:在处理程序的过程中,可能会输入我们不想要的值,导致程序的崩溃,当加上了异常的捕获和处理,会使程序更流畅

3. 码云上代码提交记录

题目集:异常

3.1. 码云代码提交记录

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

选做:4. 课外阅读

任选下面一篇文章阅读,列举出几点自己能理解的异常处理最佳实践。
Best Practices for Exception Handling
Exception-Handling Antipatterns Blog
The exceptions debate

posted @ 2017-04-22 15:28  Linyq  阅读(253)  评论(1编辑  收藏  举报