异常处理
1、异常体系结构
- java.lang.Throwable
- java.lang.Error:一般不编写针对性的代码进行处理
- java.lang.Exception:可以进行异常的处理
- 编译时异常(checked)
- IOException
- FileNotFoundException
- ClassNotFoundException
- IOException
- 运行时异常(unchecked)
- NullPointerException
- ArrayIndexOutOfBoundsException
- ClassCastException
- NumberFormatException
- InputMismatchException
- ArithmeticException
- 编译时异常(checked)
2、异常处理的方式一:try-catch-finally
try {
//可能出现异常的代码
} catch (异常类型1 变量名1) {
//处理异常的方式1
} catch (异常类型2 变量名2) {
//处理异常的方式2
} catch (异常类型3 变量名3) {
//处理异常的方式3
}
......
finally {
//一定会执行的代码
}
try-catch-finally的说明
- 使用try将可能出现异常代码包装起来。在执行过程之,一旦出现异常,就会生成一个对应异常类的对象,根据此对象的类型,去catch中进行匹配
- 一旦try中的异常对象匹配到某一个catch时,就进入catch中进行异常的处理。一旦处理完成,就跳出当前的try-catch结构(在没有写finally的情况)。继续执行其后的代码
- catch中的异常类型如果没有子父类关系,则谁声明在上,谁声明在下无所谓;如果满足子父类关系,则要求子类一定声明在父类的上面,否则报错。
- 常用的异常对象处理的方式:
- String getMessage()
- printStackTrace()
- 在try结构中声明的变量,在出了try结构以后,就不能再被调用
- try-catch-finally结构可以嵌套
try-catch-finally的体会
- 使用try-catch-finally处理编译时异常,使得程序在编译时就不再报错,但是运行时仍可能报错。相当于我们使用try-catch-finally将一个编译时可能出现的异常,延迟到运行时出现。
- 开发中,由于运行时异常比较常见,所以我们通常就不针对运行时异常编写try-catch-finally了。针对编译时异常,我们一定要考虑异常的处理。
finally的说明
- finally是可选的
- finally中声明的是一定会被执行的代码。即使catch中又出现异常了,try中有return语句,catch中有return语句等情况。
- 像数据库连接、输入输出流、网络编程Socket等资源,JVM是不能自动的回收的,我们需要自己手动的进行资源的释放。此时的资源释放,就需要声明在finally中。
3、异常处理的方式二:throws + 异常类型
- "throws + 异常类型"写在方法的声明处。指明此方法执行时,可能会抛出的异常类型。一旦当方法体执行时,出现异常,仍会在异常代码处生成一个异常类的对象,此对象满足throws后异常类型时,就会被抛出。异常代码后续的代码,就不再执行!
- try-catch-finally:真正的将异常给处理掉了;throws的方式只是将异常抛给了方法的调用者,并没有真正将异常处理掉。
- 开发中如何选择使用try-catch-finally还是使用throws?
- 如果父类中被重写的方法没有throws方式处理异常,则子类重写的方法也不能使用throws,意味着如果子类重写的方法中有异常,必须使用try-catch-finally方式处理
- 执行的方法a中,先后又调用了另外的几个方法,这几个方法是递进关系执行的。我们建议这几个方法使用throws的方式进行处理。而执行的方法a可以考虑是用try-catch-finally方式进行处理。
4、自定义异常类
- 继承于现有的异常结构:RuntimeException、Exception
- 提供全局常量:serialVersionUID
- 提供重载的构造器
5、附加:Eclipse中的快捷键
- 补全代码的声明:alt + /
- 快速修饰:ctrl + l
- 批量导包:ctrl + shift + o
- 使用单行注释:ctrl + /
- 使用多行注释:ctrl + shift + /
- 取消多行注释:ctrl + shift + \
- 复制指定行的代码:ctrl + alt + down 或 ctrl + alt + up
- 删除指定行的代码:ctrl + d
- 上下移动代码:alt + up 或 alt + down
- 切换到下一行代码空位:shift + enter
- 切换到上一行代码空位:ctrl + shift + enter
- 如何查看源码:ctrl + 选中指定的结构 或 ctrl + shift + t
- 退回到前一个编辑的页面:alt + left
- 进入到下一个编辑的页面(针对与上面那条来说的):alt + right
- 光标选中指定的类,查看继承树结构:ctrl + t
- 复制代码:ctrl + c
- 撤销:ctrl + z
- 反撤销:ctrl + y
- 剪切:ctrl + x
- 粘贴:ctrl + v
- 保存:ctrl + s
- 全选:ctrl + a
- 格式化代码:ctrl + shift + f
- 选中数行,整体往后移动:tab
- 选中数行,整体往前移动:shift + tab
- 在当前类中,显示类结构,并支持搜索指定的方法、属性等:ctrl + o
- 批量修改指定的变量名、方法名、类名等:alt + shift + r
- 选中的结构的大小写的切换:变成大写:ctrl + shift + x
- 选中的结构的大小写的切换:变成小写:ctrl + shift + y
- 调出生成getter/setter/构造器等结构:alt + shift + s
- 显示当前选择资源(工程 or 文件)的属性:alt + enter
- 快速查找:参照选中的Word快速定位到下一个:ctrl + k
- 关闭当前窗口:ctrl + w
- 关闭所有的窗口:ctrl + shift + w
- 查看指定的机构使用过的地方:ctrl + alt + g
- 查找与替换:ctrl + f
- 最大化当前的View:ctrl + m
- 直接定位到当前行的首位:home
- 直接定位到当前行的末位:end