• 第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)尽量在在指定情况下抛出异常,防止造成预留空间的浪费。
    
  • 相关阅读:
    laravel-13-笔记-1
    laravel-14-笔记-2
    supervisor监听器-linux安装配置
    laravel-12-artisan命令创建view文件
    linux修改主机名
    laravel-11-laravel 模型Eloquent ORM
    laravel-composer安装laravel
    laravel-10-laravel collection集合
    laravel-8-laravel数据填充
    laravel-9-laravel数据库查询 查询组件
  • 原文地址:https://www.cnblogs.com/whting/p/6725141.html
Copyright © 2020-2023  润新知