[TOC]
讲完《类与对象》后,布置了三角形的编程作业题。这道题需要编写一个方法来判断输入是否能构成三角形。由于构造函数没有返回值,在输入不能构造三角形的情况下,调用者(main函数)就无从判断输入的正确性。这个判断输入的方法返回布尔值,而调用者仍然需要构造if语句。在Java语言里,如果需要根据不同情况,返回不同类型的值,最好的办法是抛出异常。
为什么多返回值系统会被叫做异常?Java编译器可以帮我们检查出程序的语法错误。然而,Java编译器不能预测用户的输入,也就检测不到三角形边长的错误,因此程序代码要用分支来判断用户输入的正确性,而不正确的用户输入被称为异常(错误)。。
常用的异常处理语句try-catch格式如下:
try {
可能出现异常的函数调用
}
catch(SomeException e) { //捕捉到的异常对象 e
处理异常
}
异常处理的机制是这样的:用try语句块来包裹可能出错的子函数,子函数用return语句返回正常结果,或者用throw语句来返回异常对象;子函数返回后,try语句块检查子函数返回的方式,用return返回则执行下一句,用throw返回则进入对应的catch块;如果没有对应的catch块则母函数也返回异常。
抛出异常与函数返回和分支判断有相似之处,但不完全等同。其中throw语句在子函数相当于函数返回,而try语句块相当于分支判断。习惯于把throw返回异常对象的操作称为抛出,把try-catch的分支判断称为捕获异常或检查异常,从而与正常的函数返回相区分。
捕捉异常的完全格式如下:
try {
可能会出现异常的语句
}
catch(SomeException e) {
处理异常
}
finally {
异常发生,方法返回之前,总是要执行的代码
}
如果读写外部文件时,文件被其他程序删除,那么读写操作就会出现异常。
try (
定义输入输出流(可被自动关闭的对象)
){
可能会出现异常的语句
}
catch(SomeIOException e) {
处理异常
}
是不是所有对象都能被try-catch返回并处理?Java语言限制了能被抛出的异常类型。Java提供了所有异常的父类型Throwable
,只有Throwable
类型的对象才能作为异常对象而抛出。
Throwable
有3个重要的子孙类,Exception、Error和RuntimeException
如果将输入输出流写在try-catch语句的圆括号里,那么try部分执行后,无论是否抛出异常,输出流的close()
方法会被调用。在圆括号里初始化的对象,必须实现AutoClosable
接口。
除了系统或者第三方代码包自己抛出异常之外,自行编写的方法也可以主动抛出异常,由上一级调用者去检查处理。如果某方法不知道如何处理异常,或者不想自己亲自去处理异常,就可以抛出本方法产生的异常。
异常可以从函数体的任何位置抛出,抛出异常后会返回函数的调用者,而不再执行后续操作。如果调用者没有捕获异常,那么异常还会向上传播,直到返回主函数或被捕获。
在Java应用中如果main方法也不知道如何处理异常,也可以抛出,由JVM处理异常
抛出异常之前,必须用throws
定义该方法将会抛出的异常类型。throws一般写在方法名的后面
值得注意的是,throw抛出的是一个异常对象,所以需要通过new生成一个异常对象
try(){
语句
}catch(SomeException e){
throw new AnotherException("错误原因")
}
抛出异常时,还可以引用另外一个异常。
try(){
语句
}catch(SomeException e){
throw new AnotherException("错误原因",e)
}
异常处理机制类似于条件分支,而且跨越多个函数。虽然异常处理让程序有更好的容错性,更加健壮,但是异常处理机制也有弊端:
然后咱们再讲多态、反射、注解、泛型,(也就是下星期)就可以开始数据库的学习了。数据库的基本语句我会在一周讲完,之后由另外一位学长给你们讲解JDBC,也就是Java连接数据库
他讲JDBC的时候我同样尽快把JavaScript的东西全部说完,然后咱们就可以开始一些小小的练手项目了