第09周-异常

1. 本周学习总结

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

1109200-20170421162443102-1785101938.png

异常处理机制:
  • 发生错误生成异常对象
  • JVM发现异常对象并寻找相应的代码进行处理

  • 本质:将程序控制权从错误产生的地方-->能够处理这种情况的地方

异常机制的好处:
  • 出错信息可以很详细(以对象形式包装)
  • 让用户有效地发现错误
  • 出错代码与错误处理相分离

2. 书面作业

——本次PTA作业题集异常

1. 常用异常__题目5-1

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

1109200-20170421170349759-1934717868.png

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

答:

  • 出现的异常:空指针(NullPointerException)、数字格式转化异常(NumberFormatException)......
  • 这两个异常都不需要捕获,属于RuntimeException(运行时异常),顺利通过编译,Unchecked Exception;
  • 避免:比如空指针,在写程序时,注意判断是否为空。
1.3 什么样的异常要求用户一定要使用捕获处理?

答:除了Exception中的RuntimeException(运行异常)以外都一定要使用捕获处理,即可以被处理(修复)的错误。

2. 处理异常使你的程序更加健壮__题目5-2

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

1109200-20170421230529821-1826806408.png

2.2 实验总结

我的总结:相对来说比较简单,要注意的是重新输入那个提示异常的下标位置,用i--,这个地方考虑的过多了。

3. throw与throws__题目5-3

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

1109200-20170421232641837-577872715.png

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

答:

  • 源代码:

1109200-20170421232950102-631640887.png
1109200-20170421233308884-1516557588.png
1109200-20170421233416352-439480802.png

  • 抛出异常时需要传递给调用者的信息:

(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 截图你的提交结果(出现学号)

1109200-20170421233636806-1846935268.png

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
1109200-20170422133631509-1120096824.png
作业2
(原图)
1109200-20170422175336118-1599583633.png

  • 新建:

1109200-20170422174917415-107464495.png
1109200-20170422175030165-2134587209.png

  • 编辑:

1109200-20170422174823806-918273779.png
1109200-20170422175145462-1774525516.png

  • 删除:

1109200-20170422175246915-287461363.png

8. 选做:课外练习

——JavaTutorial中Questions and Exercises
练习总结

    Questions中的问题都是基础,但是第一题就错了,以为try-catch一定要搭配使用,没有自己敲一下代码,也没有完全理解异常;然后第二题理解到异常也需要对症下药,要捕捉自己认为有价值的异常;第三题、第四题做对了。

    Exercises中第一题,可以说照写入的样子写一个读取吧,注意一下文件无法找到的异常;第二题就是要写上捕捉异常的方法并且让程序编译成功。

3. 码云上代码提交记录——题目集:异常

3.1. 码云代码提交记录

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

选做:4. 课外阅读

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

答:

  • 关于The exceptions debate的阅读:(待续)
    (1)程序中编写的代码一般来说只抛出运行时异常(RunTimeException)。
    (2)尽量在在指定情况下抛出异常,防止造成预留空间的浪费。

转载于:https://www.cnblogs.com/whting/p/6725141.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值