Java中异常处理的一些问题

问题:
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 里面的异常");
          }
     }
}


异常的继承关系:Java中异常处理的一些问题
Java中异常处理的一些问题

自动关闭资源的try语句:
try{
(自动关闭)资源要实现autocloseable或者closeable接口
}

子类方法抛出的异常不允许抛出的异常比父类的多