201621123031 《Java程序设计》第10周学习总结

做业10-异常


1.本周学习总结

1.1 以你喜欢的方式(思惟导图或其余)概括总结异常相关内容。

1.捕捉异常
Java中的异常捕获结构由trycatchfinally三个部分组成。其中try语句用于存放可能发生异常的语句,catch语句用于激发被捕获的异常,finally语句是异常结构最后处理的部分,不管有无异常发生,都会被执行,通常用于关闭资源。
可是在Java7中可使用try-catch-resources用来自动尝试关闭资源。
另外,finally语句块在下面四种特殊状况下不会被执行:html

  • 在finally语句块中发生了异常
  • 在finally语句块以前使用System.exit()退出程序。
  • 程序所在的线程死亡
  • 关闭CPU

2.Java常见异常java

异常类 说明
ClassCastExctption 类型转换异常
ClassNotFoundExctption 未找到相应类异常
ArithmeticExctption 算数异常
ArrayIndexOutOfBoundsExctption 数组下标越界异常
ArrayStoreExctption 数组中包含不兼容的值抛出的异常
SQLExctption 操做数据库异常
NullPointerExctption 空指针异常
NoSuchFieldExctption 字段未找到异常
NoSuchMethodExctption 方法未找到抛出的异常
NumberFormatExctption 字符串转换为数字抛出的异常
NegativeArraySizeExctption 数组元素个数为负数抛出的异常
StringIndexOutOfBoundsExctption 字符串索引超出范围抛出的异常
IOExctption 输入输出异常
IllegalAccessExctption 不容许访问某类异常
InstantiationExctption 当应用程序试图使用Class类中的newInstance()方法建立一个类的实例,而指定的类对象没法被实例化时,抛出该异常
EOFExctption 文件已结束异常
FileNotFoundExctption 文件未找到异常

顺便分享一个偶然看到的颇有趣的对各类异常的解释连接
3.自定义异常
使用Java异常类能够描述在编程时出现的大部分异常的状况,咱们只须要继承异常类就能够进行自定义异常的操做。
自定义异常的步骤:数据库

  • 建立自定义异常
  • 在方法中经过throw关键字抛出异常对象
  • 若是在当前抛出异常的方法中处理异常,可使用try-catch语句块捕获并处理,不然在方法的声明处经过throws关键字指明要抛出给方法调用者的异常
  • 在出现异常方法的调用者中捕获并处理异常

4.Java异常类的结构编程

 Thorwable类(表示可抛出)是全部异常和错误的超类,两个直接子类为Error和Exception,分别表示错误和异常。其中异常类Exception又分为运行时异常(RuntimeException)和非运行时异常,  这两种异常有很大的区别,也称之为不检查异常(Unchecked Exception)和检查异常(Checked Exception)。
数组

2.书面做业

本次PTA做业题集异常安全

1. 经常使用异常

结合题集题目7-1回答函数

1.1 本身之前编写的代码中常常出现什么异常、须要捕获吗(为何)?应如何避免?

答:以前编写的代码常常出现NullPointerException(空指针异常)和ArrayIndexOutOfBoundsException(数组下标越界异常)。
经过查询JDK文档:
工具

能够看出这两个异常都继承自RuntimeException(运行时异常),都属于Unchecked Exception,所以无需进行捕获,系统会对其进行检测。
对于空指针异常,能够在使用对象时判断对象是否为空,而下标越界异常则是要判断下标是否在数组长度的范围内,总之Unchecked Exception这类的异常就是要经过咱们本身检查代码行进行代码的修改来避免异常。性能

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

答:在Throwable下面有三个类:ErrorExceptionRuntimeExcepyion,其中ErrorRuntimeExcepyion及其子类的的异常都属于Unchecked Exception,不用进行捕获处理,而Exception类中的其余异常都属于checked Exception,须要使用try-catch进行捕获或是使用throw关键字进行抛出。学习

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

题集题目7-2

2.1 实验总结。并回答:怎么样才能让你的程序更加健壮?

这题只要在进行字符串转换为数字时进行'try-catch'的处理,若是出现异常除了要输出外还要记得将下标减1。
对程序进行异常处理能够有效的提升程序的健壮性,就像在这一题中,若是不进行相应的异常处理,那当程序中出现非整形数据时就会出错,程序就会中止运行,可是当咱们加上异常处理后,程序就能够正常运行并告知咱们错误信息。可是也要记住,不是全部的地方都要进行异常处理,咱们要忽略掉一些能够忽略的异常,由于过多的异常处理在程序运行的时候还有可能会影响到程序的性能。

3. throw与throws

题集题目7-3
阅读Integer.parsetInt源代码

3.1 Integer.parsetInt一开始就有大量的抛出异常的代码,这种作法有什么好处?

答:源代码太长,就不贴出来了,经过源代码能够看出, Integer.parsetInt 虽然只有一种异常,即NumberFormatException,可是在一开始,它就考虑了多种可以产生该异常的状况进行异常的抛出,这样能够在传入的数据的时候就进行判断,看是否符合条件,这样能够避免传入错误的参数而致使程序崩溃的状况,让程序更加健壮。

3.2 结合本身编写的程序与3.1,分析本身编写的方法抛出异常时通常须要传递给调用者一些什么信息?

答:本题的代码中,产生的异常只有IllegalArgumentException可是根据不一样的输入数据,其产生该异常的缘由也不一样,所以在本身编写方法时就要告诉调用者产生异常的具体缘由,像begin>end或是begin和end范围错误的关系。一样的,在Integer.parsetInt中也是如此,它也是只有NumberFormatException一种异常,可是多是由空值等缘由产生的。所以在编写代码时咱们要告诉调用者的不只仅是产生了什么异常,还要准确的告诉调用者产生异常的具体缘由。

4. 用异常改进ArrayIntegerStack

题集题目6-3

4.1 结合6-3代码,回答使用抛出异常的方式表明程序运行时出错有什么好处?比单纯的返回错误值,有何优势?

答:当程序运行时出错时,这时的程序已是产生了让程序没法本身执行下去的错误,只能靠系统干预来强行终止程序,也就是程序崩溃的状况。可是若是咱们使用抛出异常的方法来代替程序的运行时出错,虽然两者都能告诉咱们错误信息,可是后者中程序不会崩溃,就算是程序不去处理异常而致使程序的退出,也只是依靠程序的自身流程,属于正常状况。并且,咱们还能够经过对异常进行处理来使程序可以继续执行下去。就像本题中,咱们能够经过异常处理来使得程序接收到非法参数时不会当即崩溃,并且能够正常的执行下去,使这个程序变得更加健壮。
对于异常和返回错误自己的区别,那就是>异常是强类型的,类型安全的分支处理技术;而返回错误是其弱化的,不安全的版本。

相比于单纯返回错误值,使用异常机制来处理有以下几个优势

  • 异常可以携带的信息量比返回值多,若是想要知道详细的信息,使用异常更加方便。
  • 对于一些没有返回值的方法,想要第一时间获得异常信息,只能使用异常。
  • 异常必须被处理,不然程序会退出,而使用返回值,不去处理也不会发生什么,但这并非咱们所想要的。
  • 异常机制使用的是一个独立的传播途径,不须要占用咱们的返回值,这样咱们就没必要去专门设置特定的返回值来指示错误信息。

4.2 若是一个方法内部的内码抛出的是RuntimeException类型的异常,那么方法声明是否应该使用throws关键字,若是使用throws关键字声明该方法抛出的异常,能给咱们带来什么好处吗?

答:RuntimeException类型的异常属于Unchecked Exception,在程序运行中系统会自动进行检测,例如前面提到的空指针异常以及数组下标越界异常等,不须要使用throws关键字来声明。
若是用throw关键字来声明RuntimeException类型的异常,虽然系统能够编译经过,可是只能说这种方法有点多此一举了。对于通常的运行时异常,咱们通常都是对其进行排错处理,将错误代码改正过来,而不是去报告错误信息。再者,若是全部的运行时异常都要用try-catch来处理,那咱们的程序的性能反而会降低,所以最好不要用throw关键字来声明RuntimeException类型的异常。

5. 函数题-多种异常的捕获

题集题目6-1

5.1 结合6-1代码,回答:一个try块中若是可能抛出多种异常,且异常之间可能有继承关系,捕获时须要注意些什么?

答:对于存在继承关系的异常,要注意要让子类的异常在父类异常的前面,不然子类的异常就不会被捕获到,这是无心义的,固然,编译器也不容许咱们这么写。

5.2 一个try块中若是可能抛出多种异常,使用Java8的多重异常捕获语法须要注意些什么?

答:Java8中的多重异常捕获可使咱们在一个catch语句中捕获多个异常,以下:

try{
//一段代码
}
catch(IOException | SQLException | Exception ex){
throw new MyException(ex.getMessage());
}

能够看出,不一样的异常之间使用”|”来分隔,固然,这种多重异常捕获的方法也一样要注意异常之间的继承关系,子类的异常必定要在父类异常的左边,不然编译器也会报错。

6. 为以下代码加上异常处理

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));//打印数组内容

6.1 改正代码,并增长以下功能。当找不到文件时,需提示用户找不到文件xxx,请从新输入文件名,而后尝试从新打开。 若是是其余异常则提示打开或读取文件失败!

答:改正后的代码以下:

public class Test2 {

    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);
        String file;
        int flag=1;
        byte[] content = null;
        FileInputStream fis = null;
        while(flag==1){
        try {
            file = sc.next();
            fis = new FileInputStream(file);
            flag=0;
            int bytesAvailabe = fis.available();// 得到该文件可用的字节数
            if (bytesAvailabe > 0) {
                content = new byte[bytesAvailabe];// 建立可容纳文件大小的数组
                fis.read(content);// 将文件内容读入数组
            }
            System.out.println(Arrays.toString(content));// 打印数组内容
        }catch(FileNotFoundException e){
            System.out.println("找不到文件,请从新输入文件名");
            file = sc.next();
        }
        catch (IOException e) {
            System.out.println("打开或读取文件失败");

        } finally{
            try {
                fis.close();
                System.out.println("关闭文件ing");
            } catch (Exception e) {
                System.out.println("关闭文件失败");
            }
        }
        }

    }
}

6.2 结合题集6-2代码,要将什么样操做放在finally块?为何?使用finally关闭资源须要注意一些什么?

答:不管是否抛出异常,finally语句块老是会被执行,所以finally语句块通常用来释放资源,进行在使用finally关闭资源的时候,要注意close也可能会产生空指针异常,所以也要对其进行try-catch处理。

6.3 使用Java7中的try-with-resources来改写上述代码实现自动关闭资源。简述这种方法有何好处?

使用try-with-resources改写代码:

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));// 打印数组内容
        } catch(FileNotFoundException e){
            System.out.println("找不到文件,请从新输入文件名");
        }
        catch (IOException e) {
            System.out.println("打开或读取文件失败");

        } 
        } 

    }
}

使用这种方法来改写代码只要将须要关闭的资源放进try语句的圆括号里便可,它能够在最后自动帮咱们关闭咱们所打开的资源,咱们就不须要再去另写一个finally来关闭这个资源。

7. 面向对象设计做业(分组完成,每组不超过3个同窗)

登陆lib.jmu.edu.cn,对图书进行搜索。而后登陆图书馆信息系统,查看个人图书馆。若是让你实现一个图书借阅系统,尝试使用面向对象建模。

7.1 该系统的使用者有谁?

答:使用者有借书的用户(程序中以学生来代替)和管理员。

7.2 主要功能模块(不要太多)

用户:

  • 用户注册
  • 用户登陆
  • 查看图书
  • 借阅图书
  • 归还图书

管理员:

  • 添加图书
  • 删除图书
  • 查看图书

7.3 该系统的主要的类设计及类图(可用)

7.4 你准备如何存储图书信息、解决信息、读者信息等

答:存储图书信息使用Map键值对,key值存放图书,value值存放数量。
借阅信息也使用Map键值对存储
读者信息使用Set集合存储

9. 选作:使用静态代码扫描工具 扫描本身的购物车代码

9.1 分析本身代码中在规范方面出现的问题。





截图了部分扫描中出现的问题,发现本身在代码规范中主要仍是起名的问题,以前也比较不会注意这方面,类名包名方法名之类的不会去在乎大小写的问题。而后对于if还有for语句没有大括号的缘由主要仍是由于平时写的代码的行数都很少,所以用不用大括号感受都不会有什么影响,可能在比较大的程序里会有必定的影响吧。

9.2 思考如何解决这些问题。

答:对类或者方法、成员变量起名的时候仍是要注意名字的合法性和准确性。不能像之前同样为了方便随便用一个字母变量来代替

3.码云及PTA

题目集:异常

3.1. 码云代码提交记录

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

3.2 截图PTA题集完成状况图

须要有两张图(1. 排名图。2.PTA提交列表图)

3.3 统计本周完成的代码量

须要将每周的代码统计状况融合到一张表中。

周次 总代码量 新增代码量 总文件数 新增文件数
2 607 607 15 15
3 1642 1035 33 18
5 2044 402 42 9
6 2874 830 57 15
7 3161 287 63 6
8 4299 1138 72 9
9 4831 532 81 9
10 5475 644 93 12
11 5958 483 102 9
相关文章
相关标签/搜索