try中有return,finally还会执行吗?

会执行,并且finally的执行会早于try中的return

结论:

  1. 不管有木有异常,finally块中的代码都会执行
  2. 当try和catch中有return时,finally仍然会执行
  3. 因为如果存在finally代码块,try中的return语句不会立马返回给调用者,而是会记录下当前的返回值,等待finally代码块执行完毕后再向调用者返回,然后如果finally代码块中对返回值进行了修改,则会返回修改后的返回值。

Exception和Error

Java可能抛出的结构有三种类型:运行时异常(RuntimeException),受检异常(CheckedException)和错误(Error)。

  • 运行时异常(RuntimeException)

    • 定义:
      • RuntimeException及其子类都被称为运行时异常。
    • 特点:
      • Java编译器不会检查该异常。也就是说当程序中可能出现该异常时,如果没有通过throws声明抛出它,也没有用try-catch捕获它,还是会编译通过。
    • 常见的几种运行时异常:
      • ClassCastException 类转换异常
      • ArithmeticException 除零异常
      • IndexOutofBoundsException 数组越界异常
      • NullPointerException 空指针异常
      • BufffferOverflflowException 缓冲区溢出异常
  • 受检异常(CheckedException)

    • 定义:
      • Exception本身,以及Exception的子类中除了“运行时异常”之外的其他子类都属于受检查异常。
    • 特点:
      • Java编译器会检查此类异常,要么通过throws对该类异常进行抛出,要么通过try-catch进行捕获处理,否则不能通过编译。
    • 常见的几种被检查异常:
      • IOException (读写异常)
      • FileNotFoundException (找不到文件异常)
      • SQLException (比如在使用JDBC访问数据库时需要处理的SQLException)
  • 错误(Error)

    • 定义:
      • Error类及其子类
    • 特点:
      • 和运行时异常一样,编译器也不会对错误进行检查。
      • Error 类型的错误通常为虚拟机相关错误,如系统崩溃,内存不足,堆栈溢出等,一旦这类错误发生,通常应用程序会被终止,仅靠应用程序本身无法恢复。

throw和throws的区别是什么?

Java中的异常处理除了捕获和处理异常之外,还可以抛出异常,可以通过throws关键字在方法上声明该方法要抛出的异常,或者在方法内部通过throw关键字来抛出异常对象。

区别:

  • throw 关键字用在方法内部,只能用于抛出一种异常,用来抛出方法或代码块中的异常,受查异常和非受查异常都可以被抛出。
  • throws 关键字用在方法声明上,可以抛出多个异常,用来标识该方法可能抛出的异常列表。一个方法用 throws 标识了可能抛出的异常列表,调用该方法的方法中必须包含可处理异常的代码,否则也要在方法签名中用 throws 关键字声明相应的异常。

final、finally、finalize 有什么区别?

  • final可以修饰类、变量、方法,修饰类表示该类不能被继承、修饰方法表示该方法不能被重写、修饰变量表示该变量是一个常量不能被重新赋值。
  • finally一般作用在try-catch代码块中,在处理异常的时候,通常我们将一定要执行的代码方法finally代码块中,表示不管是否出现异常,该代码块都会执行,一般用来存放一些关闭资源的代码。
  • finalize是一个方法,属于Object类的一个方法,而Object类是所有类的父类,Java 中允许使用 finalize()方法在垃圾收集器将对象从内存中(析构)清除出去之前做必要的清理工作。