异常的基础知识。【Java】异常处理详解_throws异常处理_Time<EveryThing>的博客-CSDN博客
- 异常可以分为检查类异常和非检查类型异常。非检查指的是Error和RuntimeExcepion。Runtime异常是可被预测的异常,如:数组越界,空指针等等。这些异常是可被代码检测出来的。如果抛出此类异常,通常代表代码写的不是很好.所以尽量自己处理而不是tryCatch。
throws
checked类型异常
如果调用的方法里抛出检查类型异常,那么你的方法必须要么try catch,要么继续抛出(在方法名后throws)。
如果你手动throw一个检查类型异常,那么必须在方法名上throws。
不然不能编译,如图
unchecked类型异常
根据我的测试,对于RuntimeException,加不加throws都一样。不加也能自动往上抛;加了也不会强制上层捕获。
异常如果中间不捕获,会层层往上抛。
捕获异常
throw会停止方法,后面的语句都不执行,且会按栈顺序层层上抛,哪怕是main方法。main抛出的异常给jvm处理。
所以异常不捕获可能会造成main方法停止,即程序结束。
示例程序:main->service(没有catch)->manager(throw Exception)
图1.捕获了异常, 继续执行
图 2. 不捕获异常,方法结束
图3.在中间捕获,上层可以正常运行
catch可以有多个,子类应该在父类上边。且catch只会按顺序匹配一个。
catch里面抛出异常,也会终止方法。
finally一定会执行。当try catch中有return时,会先把值存到局部变量,执行完finally在return这个值。
当finally语句中也有return时,会覆盖try/catch语句块的return,所以一般不要在finally中加return语句。
try不能省略,catch和finally能省略一个。