1.捕捉异常
Java中的异常捕获结构由try
、catch
和finally
三个部分组成。其中try
语句用于存放可能发生异常的语句,catch
语句用于激发被捕获的异常,finally
语句是异常结构最后处理的部分,不管有无异常发生,都会被执行,通常用于关闭资源。
可是在Java7中可使用try-catch-resources
用来自动尝试关闭资源。
另外,finally语句块在下面四种特殊状况下不会被执行:html
System.exit()
退出程序。2.Java常见异常java
异常类 | 说明 |
---|---|
ClassCastExctption | 类型转换异常 |
ClassNotFoundExctption | 未找到相应类异常 |
ArithmeticExctption | 算数异常 |
ArrayIndexOutOfBoundsExctption | 数组下标越界异常 |
ArrayStoreExctption | 数组中包含不兼容的值抛出的异常 |
SQLExctption | 操做数据库异常 |
NullPointerExctption | 空指针异常 |
NoSuchFieldExctption | 字段未找到异常 |
NoSuchMethodExctption | 方法未找到抛出的异常 |
NumberFormatExctption | 字符串转换为数字抛出的异常 |
NegativeArraySizeExctption | 数组元素个数为负数抛出的异常 |
StringIndexOutOfBoundsExctption | 字符串索引超出范围抛出的异常 |
IOExctption | 输入输出异常 |
IllegalAccessExctption | 不容许访问某类异常 |
InstantiationExctption | 当应用程序试图使用Class类中的newInstance()方法建立一个类的实例,而指定的类对象没法被实例化时,抛出该异常 |
EOFExctption | 文件已结束异常 |
FileNotFoundExctption | 文件未找到异常 |
顺便分享一个偶然看到的颇有趣的对各类异常的解释连接
3.自定义异常
使用Java异常类能够描述在编程时出现的大部分异常的状况,咱们只须要继承异常类就能够进行自定义异常的操做。
自定义异常的步骤:数据库
try-catch
语句块捕获并处理,不然在方法的声明处经过throws
关键字指明要抛出给方法调用者的异常4.Java异常类的结构编程
Thorwable类(表示可抛出)是全部异常和错误的超类,两个直接子类为Error和Exception,分别表示错误和异常。其中异常类Exception又分为运行时异常(RuntimeException)和非运行时异常, 这两种异常有很大的区别,也称之为不检查异常(Unchecked Exception)和检查异常(Checked Exception)。
数组
本次PTA做业题集异常
安全
结合题集题目7-1回答函数
答:以前编写的代码常常出现NullPointerException
(空指针异常)和ArrayIndexOutOfBoundsException
(数组下标越界异常)。
经过查询JDK文档:
工具
能够看出这两个异常都继承自RuntimeException
(运行时异常),都属于Unchecked Exception
,所以无需进行捕获,系统会对其进行检测。
对于空指针异常,能够在使用对象时判断对象是否为空,而下标越界异常则是要判断下标是否在数组长度的范围内,总之Unchecked Exception
这类的异常就是要经过咱们本身检查代码行进行代码的修改来避免异常。性能
答:在Throwable
下面有三个类:Error
、Exception
、RuntimeExcepyion
,其中Error
、RuntimeExcepyion
及其子类的的异常都属于Unchecked Exception
,不用进行捕获处理,而Exception
类中的其余异常都属于checked Exception
,须要使用try-catch
进行捕获或是使用throw
关键字进行抛出。学习
题集题目7-2
这题只要在进行字符串转换为数字时进行'try-catch'的处理,若是出现异常除了要输出外还要记得将下标减1。
对程序进行异常处理能够有效的提升程序的健壮性,就像在这一题中,若是不进行相应的异常处理,那当程序中出现非整形数据时就会出错,程序就会中止运行,可是当咱们加上异常处理后,程序就能够正常运行并告知咱们错误信息。可是也要记住,不是全部的地方都要进行异常处理,咱们要忽略掉一些能够忽略的异常,由于过多的异常处理在程序运行的时候还有可能会影响到程序的性能。
题集题目7-3
阅读Integer.parsetInt
源代码
Integer.parsetInt
一开始就有大量的抛出异常的代码,这种作法有什么好处?答:源代码太长,就不贴出来了,经过源代码能够看出, Integer.parsetInt
虽然只有一种异常,即NumberFormatException
,可是在一开始,它就考虑了多种可以产生该异常的状况进行异常的抛出,这样能够在传入的数据的时候就进行判断,看是否符合条件,这样能够避免传入错误的参数而致使程序崩溃的状况,让程序更加健壮。
答:本题的代码中,产生的异常只有IllegalArgumentException
可是根据不一样的输入数据,其产生该异常的缘由也不一样,所以在本身编写方法时就要告诉调用者产生异常的具体缘由,像begin>end或是begin和end范围错误的关系。一样的,在Integer.parsetInt
中也是如此,它也是只有NumberFormatException
一种异常,可是多是由空值等缘由产生的。所以在编写代码时咱们要告诉调用者的不只仅是产生了什么异常,还要准确的告诉调用者产生异常的具体缘由。
题集题目6-3
答:当程序运行时出错时,这时的程序已是产生了让程序没法本身执行下去的错误,只能靠系统干预来强行终止程序,也就是程序崩溃的状况。可是若是咱们使用抛出异常的方法来代替程序的运行时出错,虽然两者都能告诉咱们错误信息,可是后者中程序不会崩溃,就算是程序不去处理异常而致使程序的退出,也只是依靠程序的自身流程,属于正常状况。并且,咱们还能够经过对异常进行处理来使程序可以继续执行下去。就像本题中,咱们能够经过异常处理来使得程序接收到非法参数时不会当即崩溃,并且能够正常的执行下去,使这个程序变得更加健壮。
对于异常和返回错误自己的区别,那就是>异常是强类型的,类型安全的分支处理技术;而返回错误是其弱化的,不安全的版本。
相比于单纯返回错误值,使用异常机制来处理有以下几个优势
throws
关键字,若是使用throws
关键字声明该方法抛出的异常,能给咱们带来什么好处吗?答:RuntimeException
类型的异常属于Unchecked Exception
,在程序运行中系统会自动进行检测,例如前面提到的空指针异常以及数组下标越界异常等,不须要使用throws
关键字来声明。
若是用throw
关键字来声明RuntimeException
类型的异常,虽然系统能够编译经过,可是只能说这种方法有点多此一举了。对于通常的运行时异常,咱们通常都是对其进行排错处理,将错误代码改正过来,而不是去报告错误信息。再者,若是全部的运行时异常都要用try-catch
来处理,那咱们的程序的性能反而会降低,所以最好不要用throw
关键字来声明RuntimeException
类型的异常。
题集题目6-1
答:对于存在继承关系的异常,要注意要让子类的异常在父类异常的前面,不然子类的异常就不会被捕获到,这是无心义的,固然,编译器也不容许咱们这么写。
答:Java8中的多重异常捕获可使咱们在一个catch语句中捕获多个异常,以下:
try{ //一段代码 } catch(IOException | SQLException | Exception ex){ throw new MyException(ex.getMessage()); }
能够看出,不一样的异常之间使用”|”来分隔,固然,这种多重异常捕获的方法也一样要注意异常之间的继承关系,子类的异常必定要在父类异常的左边,不然编译器也会报错。
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));//打印数组内容
答:改正后的代码以下:
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("关闭文件失败"); } } } } }
答:不管是否抛出异常,finally
语句块老是会被执行,所以finally
语句块通常用来释放资源,进行在使用finally关闭资源的时候,要注意close
也可能会产生空指针异常,所以也要对其进行try-catch
处理。
使用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来关闭这个资源。
登陆lib.jmu.edu.cn,对图书进行搜索。而后登陆图书馆信息系统,查看个人图书馆。若是让你实现一个图书借阅系统,尝试使用面向对象建模。
答:使用者有借书的用户(程序中以学生来代替)和管理员。
用户:
管理员:
答:存储图书信息使用Map键值对,key值存放图书,value值存放数量。
借阅信息也使用Map键值对存储
读者信息使用Set集合存储
截图了部分扫描中出现的问题,发现本身在代码规范中主要仍是起名的问题,以前也比较不会注意这方面,类名包名方法名之类的不会去在乎大小写的问题。而后对于if还有for语句没有大括号的缘由主要仍是由于平时写的代码的行数都很少,所以用不用大括号感受都不会有什么影响,可能在比较大的程序里会有必定的影响吧。
答:对类或者方法、成员变量起名的时候仍是要注意名字的合法性和准确性。不能像之前同样为了方便随便用一个字母变量来代替
题目集:异常
须要有两张图(1. 排名图。2.PTA提交列表图)
须要将每周的代码统计状况融合到一张表中。
周次 | 总代码量 | 新增代码量 | 总文件数 | 新增文件数 |
---|---|---|---|---|
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 |