问题:
throws和throw的区别
发生异常之后代码如何运行
error和Exception
检查异常和非检查异常
try catch 和 finally之间执行,finally里面的throw会导致catch里面的throw失效。
使用了try catch语句之后还要throws来抛出错误么
不需要,两个选一个,对于检查异常。
只要对应的try执行了,则它一定也执行。只有一种方法让finally块不执行:System.exit()
Throws和Throw的区别:
Throws主要在方法签名中使用,声明该方法可能抛出的异常类型。
Throw用于抛出一个异常实例,具体的异常对象。
发生异常之后:
找到了对应的catch对象之后就执行catch语句,并且不会向下执行;
没找到对应的异常类程序直接停止运行。
什么时候异常要用try catch 来获取,什么时候不需要?
检查异常和非检查异常:
检查异常需要try catch 或者 throws抛出异常,调用者处理
非RuntimeException一般是外部错误(非Error),其必须被 try{}catch语句块所捕获
不管catch是否捕获异常,finally语句块都是要被执行的
在try语句块或catch语句块中执行到System.exit(0)直接退出程序,直接退出虚拟机,使得catch和finally没有机会运行
finally块中的return语句会覆盖try块中的return返回
finally 语句块在 catch语句块中的return语句之前执行
如果try语句里有return,那么代码的行为如下:
1.如果有返回值,就把返回值保存到局部变量中
2.执行jsr指令跳到finally语句里执行
3.执行完finally语句后,返回之前保存在局部变量表里的值
如果try,finally语句里均有return,忽略try的return,而使用finally的return.
抛出异常的结果和return的一致,throw抛出后程序也会结束运行:
public
class
ExceptionDemo1 {
public
static
void
main(String[]
args
)
throws
Exception {
ThrowException
();
}
public
static
void
ThrowException
()
throws
Exception{
try
{
int
x
=5/0;
System.
out
.println(
"运行不"
);
}
catch
(Exception
e
) {
e
.printStackTrace();
throw
new
Exception(
"会不会抛出呢?"
);
}
finally
{
throw
new
Exception(
"finally 里面的异常"
);
}
}
}
异常的继承关系:


自动关闭资源的try语句:
try{
(自动关闭)资源要实现autocloseable或者closeable接口
}
子类方法抛出的异常不允许抛出的异常比父类的多