201521123006 《java程序设计》 第9周学习总结
1. 本周学习总结
**1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容。 **

2. 书面作业
本次PTA作业题集异常
**1.常用异常 **
题目5-1
**1.1 截图你的提交结果(出现学号) **

**1.2 自己以前编写的代码中经常出现什么异常、需要捕获吗(为什么)?应如何避免?
以前经常出现的异常为数组越界,数组越界为RuntimeException,一般来说是由于编码错误,可以不捕获。我们可以尽量把数组的大小定义大些,或者根据输入定义数组大小,尽量改进代码。

**1.3 什么样的异常要求用户一定要使用捕获处理? **
除Error与RuntimeException都是unchecked exception代码中无需try-catch捕获处理外,其他异常都需要使用捕获处理。
**2.处理异常使你的程序更加健壮 **
题目5-2
**2.1 截图你的提交结果(出现学号) **

**2.2 实验总结 **
使用Integer.parseInt(in.next())对数组进行输入赋值,这时若输入的不是数字,则容易出现NumberFormatException 异常,这时需要我们对它进行捕获。并且因为是在for循环中使用,所以需要注意循环中是否把错误的输入也计算入了。
**3.throw与throws **
题目5-3
**3.1 截图你的提交结果(出现学号) **

**3.2 阅读Integer.parsetInt源代码,结合3.1说说抛出异常时需要传递给调用者一些什么信息? **
源代码
public static int parseInt(String s) throws NumberFormatException {
        return parseInt(s,10);
    }
public static int parseInt(String s, int radix)
                throws NumberFormatException
    {
        /*
         * WARNING: This method may be invoked early during VM initialization
         * before IntegerCache is initialized. Care must be taken to not use
         * the valueOf method.
         */
        if (s == null) {
            throw new NumberFormatException("null"); //String s 为null时,抛出异常NumberFormatException,输出“null”
        }
        if (radix < Character.MIN_RADIX) {
            throw new NumberFormatException("radix " + radix +
                                            " less than Character.MIN_RADIX");//当radix < Character.MIN_RADIX时,抛出异常NumberFormatException及语句。
        }
        if (radix > Character.MAX_RADIX) {
            throw new NumberFormatException("radix " + radix +
                                            " greater than Character.MAX_RADIX");//当radix > Character.MIN_RADIX时,抛出异常NumberFormatException及语句。
        }
        int result = 0;
        boolean negative = false;
        int i = 0, len = s.length();
        int limit = -Integer.MAX_VALUE;
        int multmin;
        int digit;
        if (len > 0) {
            char firstChar = s.charAt(0);
            if (firstChar < '0') { // Possible leading "+" or "-"
                if (firstChar == '-') {
                    negative = true;
                    limit = Integer.MIN_VALUE;
                } else if (firstChar != '+')//firstChar 既不是“+”,又不是“-”,抛出异常。
                    throw NumberFormatException.forInputString(s);
                if (len == 1) // Cannot have lone "+" or "-"//只为“+”或“-”,抛出异常。
                    throw NumberFormatException.forInputString(s);
                i++;
            }
            multmin = limit / radix;
            while (i < len) {
                // Accumulating negatively avoids surprises near MAX_VALUE
                digit = Character.digit(s.charAt(i++),radix);
                if (digit < 0) {//非数字字符时,抛出异常。
                    throw NumberFormatException.forInputString(s);
                }
                if (result < multmin) {//溢出时,抛出异常。
                    throw NumberFormatException.forInputString(s);
                }
                result *= radix;
                if (result < limit + digit) {//溢出时,抛出异常。
                    throw NumberFormatException.forInputString(s);
                }
                result -= digit;
            }
        } else {//字符串为空串时,抛出异常。
            throw NumberFormatException.forInputString(s);
        }
        return negative ? result : -result;
    }
如在3.1中我们需要根据输入的不同抛出不同的异常,即IllegalArgumentException。抛出异常时需要传递给我们出现的异常为什么,以及输出我们在抛出异常时赋予他们的值或我们想要的输出格式,和我们出错的地方(导致异常的原因)。
**4.函数题 **
题目4-1(多种异常的捕获)
**4.1 截图你的提交结果(出现学号) **

**4.2 一个try块中如果可能抛出多种异常,捕获时需要注意些什么? **
对于可能抛出多个异常的try块,我们可以对每个异常都提供一个catch块进行处理,也可以不用。如果不对每个异常都提供catch块,此时就需要我们提供这些异常的父类,如Exception,使用catch块处理。当有多个catch块时,我们一定要让异常的范围按从小到大排列,因为如果子类异常在父类异常之后,那么子类异常的catch块将不会执行,父类异常的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;
int bytesAvailabe = 0;
try {
        fis = new FileInputStream("testfis.txt");
        bytesAvailabe = fis.available();//获得该文件可用的字节数
        if(bytesAvailabe>0){
            content = new byte[bytesAvailabe];//创建可容纳文件大小的数组
	    fis.read(content);
        }
        System.out.println(Arrays.toString(content));//打印数组内容
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
	e.printStackTrace();
    } catch (IOException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
    }finally{
		if(fis!=null){
		    try {
			    fis.close();
			} catch (IOException e) {
			    // TODO Auto-generated catch block
			    e.printStackTrace();
			}
	    }
    }
**5.2 使用Java7中的try-with-resources来改写上述代码实现自动关闭资源. **
byte[] content = null;
int bytesAvailabe = 0;
try(FileInputStream fis= new FileInputStream("testfis.txt")) {
        bytesAvailabe = fis.available();//获得该文件可用的字节数
        if(bytesAvailabe>0){
            content = new byte[bytesAvailabe];//创建可容纳文件大小的数组
	    fis.read(content);
        }
        System.out.println(Arrays.toString(content));//打印数组内容
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
	e.printStackTrace();
    } catch (IOException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
    }
**6.重点考核:使用异常改进你的购物车系统(未提交,得分不超过6分) **
举至少两个例子说明你是如何使用异常处理机制让你的程序变得更健壮。
说明要包含2个部分:1. 问题说明(哪里会碰到异常)。2.解决方案(关键代码)
输入不为数字
private void addButtonActionPerformed(java.awt.event.ActionEvent evt) {
        ShoppingDao shoppingDao = new ShoppingDaoJTableImpl(jTable1);
        String[] strs = jTextField1.getText().split(" ");
        try{
            String name = strs[0];
            Double price = Double.parseDouble(strs[1]);//当输入不为double型数字,抛出异常
            Integer num = Integer.parseInt(strs[2]);//当输入不为integer型数字,抛出异常
            Shopping s = new Shopping(name, price, num);
            boolean flag = shoppingDao .save(s);
            if(flag){
                JOptionPane.showMessageDialog(null, "添加成功");
            }else{
                JOptionPane.showMessageDialog(null, "添加失败!");
         }
        }catch(NumberFormatException e){
            out.setText("输入的商品价格和数量应为数字,请重输");
        }
}

找不到指定路径的文件
private void sumActionPerformed(java.awt.event.ActionEvent evt) {
    double sum=0.0;
    try(FileReader fis = new FileReader ("D:/testfis.txt");
        BufferedReader s=new BufferedReader(fis)) {//如果找不到文件,抛出异常
        Double price=0.0;
        Integer num=0;
        while(s.readLine()!=null){
        price=Double.parseDouble(in.readLine());
        num = Integer.parseInt(in.readLine());
        sum+=price*num;
    } catch (FileNotFoundException e) {
        out.setText("找不到文件");
    } catch (IOException e) {
	out.setText("文件读写异常");
    }
}
**7.选做:JavaFX入门 **
如果未完成作业1、2的先完成1、2。贴图展示。如果已完成作业1、2的请完成作业3。内有代码,可在其上进行适当的改造。建议按照里面的教程,从头到尾自己搭建。
**8.选做:课外练习 **
JavaTutorial中Questions and Exercises
练习总结
3. 码云上代码提交记录
题目集:异常
**3.1. 码云代码提交记录 **
- 在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图

选做:4. 课外阅读
任选下面一篇文章阅读,列举出几点自己能理解的异常处理最佳实践。
Best Practices for Exception Handling
Exception-Handling Antipatterns Blog
The exceptions debate
201521123006 《java程序设计》 第9周学习总结的更多相关文章
- 20145213《Java程序设计》第九周学习总结
		20145213<Java程序设计>第九周学习总结 教材学习总结 "五一"假期过得太快,就像龙卷风.没有一点点防备,就与Java博客撞个满怀.在这个普天同庆的节日里,根 ... 
- 20145213《Java程序设计》第二周学习总结
		20145213<Java程序设计>第二周学习总结 教材学习内容总结 本周娄老师给的任务是学习教材的第三章--基础语法.其实我觉得还蛮轻松的,因为在翻开厚重的书本,一股熟悉的气息扑面而来, ... 
- 20145213《Java程序设计》第一周学习总结
		20145213<Java程序设计>第一周学习总结 教材学习内容总结 期待了一个寒假,终于见识到了神秘的娄老师和他的Java课.虽说算不上金风玉露一相逢,没有胜却人间无数也是情理之中,但娄 ... 
- 21045308刘昊阳 《Java程序设计》第九周学习总结
		21045308刘昊阳 <Java程序设计>第九周学习总结 教材学习内容总结 第16章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 数据库本身是个独立运行的应用程序 撰 ... 
- 20145330孙文馨   《Java程序设计》第一周学习总结
		20145330孙文馨 <Java程序设计>第一周学习总结 教材学习内容总结 刚开始拿到这么厚一本书说没有压力是不可能的,开始从头看觉得很陌生进入不了状态,就稍微会有一点焦虑的感觉.于是就 ... 
- 20145337 《Java程序设计》第九周学习总结
		20145337 <Java程序设计>第九周学习总结 教材学习内容总结 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 JDBC可以 ... 
- 20145337 《Java程序设计》第二周学习总结
		20145337 <Java程序设计>第二周学习总结 教材学习内容总结 Java可分基本类型与类类型: 基本类型分整数(short.int.long).字节(byte).浮点数(float ... 
- 20145218《Java程序设计》第一周学习总结
		20145218 <Java程序设计>第一周学习总结 教材学习内容总结 今天下午看了Java学习的视频,感觉很是新奇,之前觉得Java学起来是艰难枯燥的,但通过第一章的学习觉得如果自己可以 ... 
- 《Java程序设计》第九周学习总结
		20145224 <Java程序设计>第九周学习总结 第十六章 整合数据库 JDBC入门 ·数据库本身是个独立运行的应用程序 ·撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的 ... 
- 《Java程序设计》第二周学习总结
		20145224陈颢文<Java程序设计>第二周学习总结 教材学习内容总结 一.类型.变量与运算符 1.类型 整数: 可细分为为short整数(占2字节),int整数(占4字节),long ... 
随机推荐
- ubuntu 15.10 安装jdk
			转http://www.bkjia.com/xtzh/881605.html 第一步,下载Linux版JDK 可以通过访问Oracle官网下载,或者直接通过命令行下载. lxh@ubuntu:~$ w ... 
- Linux内存详解
			--Linux内存详解 -----------------2014/05/24 Linux的内存上表现的不像windows那么直观,本文准备详细的介绍一下Linux的内存. 请看这下有linux命令f ... 
- 【算法与数据结构】Java实现字符串的全排列及组合
			注:本文记录了代码编写及调试过程,想直接浏览正确答案的请移步文章结尾. 一.字符串的全排列问题 1. 下面是最初的代码(答案有错误-重复输出) import java.util.Scanner; pu ... 
- sqlserver-4064
			早上忘记了SQLServer的sa帐户密码,在网上搜索才弄清楚了解决办法:1.在SQLServer企业管理器中输入以下命令:ALTER LOGIN sa ENABLE GO ALTER LOGIN s ... 
- Windows Firewall Setting
			If our web site hosted on web server canot be accessed by other computer by public network, one of t ... 
- jdbc电话本项目
			整体思路:在登陆之后才能查看自己的电话本,电话本中包含用户名,联系人名字,电话,性别,分类: 1.登陆注册页面--数据库User表,注册登陆使用 2.电话本的前段显示,用表格和表单, 3.创建存取的电 ... 
- 修改(同步)linux时间
			新申请下来的机器的时间现在我们所在的时区不一致,需要同步成东八区 查看当前的时间: date -R; date +%z 修改时区: cp /usr/share/zoneinfo/Asia/Shangh ... 
- Python学习笔记5
			1.关于global声明变量的错误例子 I ran across this warning: #!/usr/bin/env python2.3 VAR = 'xxx' if __name__ == ' ... 
- 一次由SELinux引起的ssh公钥认证失败问题
			一直使用CentOS作为服务器系统,平时装完系统以后都是建立publickey认证机制,然后关闭密码认证.原本是一件轻车熟路毫无压力的事情,不想前日新装一台机器按照正常配置以后居然使用publicke ... 
- 【Linux部署 · JDK】在linux系统安装jdk
			1,检查是否安装jdk echo $JAVA_HOME 或者java -version 2,查看操作系统,很明显这是一个相当old的操作系统,i686是32位操作系统. 3,在oracle ... 
