乐趣区

关于java:面试必问Java-检查异常和非检查异常的区别别理解错了

起源:www.iteye.com/blog/yangshen998-1311682

代码

public class ExceptionTypeTest {public void doSomething()throws ArithmeticException{System.out.println();    
    }    
    public static void main(){ExceptionTypeTest ett = new ExceptionTypeTest();    
        ett.doSomething();}    
}    

问题 1: 下面的程序是否编译通过?并阐明理由。

解答: 能编译通过。剖析: 依照个别常理,定义 doSomething 办法是定义了 ArithmeticException 异样,在 main 办法外面调用了该办法。

那么该当持续抛出或者捕捉一下。然而 ArithmeticException 异样是继承 RuntimeException 运行时异样。

Java 外面异样分为两大类:checkedexception(查看异样)和 unchecked exception(未查看异样),对于未查看异样也叫 RuntimeException(运行时异样), 对于运行时异样,java 编译器不要求你肯定要把它捕捉或者肯定要持续抛出,然而对 checkedexception(查看异样)要求你必须要在办法外面或者捕捉或者持续抛出。

问题 2: 下面的程序将 ArithmeticException 改为 IOException 是否编译通过?并阐明理由。

解答: 不能编译通过。剖析:IOException extends Exception 是属于 checked exception,必须进行解决,或者必须捕捉或者必须抛出。

总结:java 中异样分为两类:checked exception(查看异样)和 unchecked exception(未查看异样), 对于未查看异样也叫 RuntimeException(运行时异样).

对未查看的异样 (unchecked exception) 的几种解决形式:

  • 捕捉
  • 持续抛出
  • 不解决

对查看的异样 (checked exception,除了 RuntimeException,其余的异样都是 checked exception) 的几种解决形式:

  • 持续抛出,消极的办法,始终能够抛到 java 虚拟机来解决
  • 用 try…catch 捕捉

留神,对于查看的异样必须解决,或者必须捕捉或者必须抛出

异样解决(Exception)

1. 异样:

程序再运行期间产生的不失常事件,它会打断指令的失常流程。异样都是产生在程序的运行期,编译呈现的问题叫语法错误。

2. 异样的解决机制:

1)当程序再运行过程中呈现了异样,JVM 主动创立一个该类型的异样对象。同时把这个异样对象交给运行时零碎。(抛出异样)

2)运行时零碎承受到一个异样对象时,它会再产生异样的代码左近查找相应的解决形式。

3)异样的解决形式有两种:

  1. 捕捉并解决:在异样的代码左近显示用 try/catch 进行解决(不合理), 运行时零碎捕捉后会查问相应的 catch 解决块,再 catch 解决块中对该异样进行解决。
  1. 查看产生异样的办法是否有向上申明异样,有向上申明,向下级查询处理语句,如果没有向上申明,JVM 中断程序的运行并解决。用 throws 向外申明(正当的解决办法)

3. 异样的分类:

  • java.lang.Throwable
    • Error 谬误:JVM 外部的重大问题。无奈复原。程序人员不必解决。
    • Exception 异样:一般的问题。通过正当的解决,程序还能够回到失常执行流程。要求编程人员要进行解决。
      • RuntimeException: 也叫非受检异样(unchecked exception). 这类异样是编程人员的逻辑问题。应该承担责任。Java 编译器不进行强制要求解决。也就是说,这类异样再程序中,能够进行解决,也能够不解决。
  

- 非 RuntimeException: 也叫受检异样(checked exception). 这类异样是由一些内部的偶尔因素所引起的。Java 编译器强制要求解决。也就是说,程序必须进行对这类异样进行解决。

4. 常见异样:

1)非受检的:

NullPointerException,ClassCastException,ArrayIndexsOutOfBoundsException,ArithmeticException(算术异样,除 0 溢出)

2)受检:

Exception,FileNotFoundException,IOException,SQLException.

5. 异样解决的两种形式:

1). 显示用 try/catch 进行解决(不合理)

try{// 可能会出现异常的代码段;}catch(异样类型 1 变量名){ // 解决制订类型的异样
// 对该类型异样的解决代码段;e.printStackTrace();}catch(){}[finally{
// 无论是否产生异样都要执行的代码段;// 常常用来清理资源
}]

2). 向上申明:用 throws 关键字,向外申明(正当的解决办法)

  • 申明本办法可能会抛出的异样列表。
  • … 办法名(参数列表) throws 异样类型 1,异样类型 2
  • 向上申明是通知本办法的调用者,在应用本办法时,应该对这些异样进行解决。

6. 手动抛出一个异样: 当程序逻辑不合乎冀望时,要停止前面代码的执行时。

在办法的代码段中,能够应用 throw 关键字手动抛出一个异样。

留神:如果手动抛出的是受检异样,那么本办法必须进行解决(应该采纳向上申明这个异样); 如果手动抛出的是非受检异样,那么能够进行解决,也能够不解决。

7. 自定义异样:当须要一些跟特定业务相干的异样信息类时。

能够继承继承 Exception 来定义一个受检异样。也能够继承自 RuntimeException 或其子类来定义一个非受检异样。

8. 异样概括:

一个图两种解决形式.

9. 异样实际:

察看抛出的异样的名字和行号很重要。

应该捕捉和解决那些已知如何解决的异样,传递那些不知如何解决的异样。

尽量减少 try 语句块的体积。

for(int i=1;i<=1000;i++){
try{...}catch(...)
}

不合理

尽量减少 try-catch 语句的嵌套。

在 catch 块代码段中,应该打印除该异样的堆栈跟踪信息以不便调试。

应用 throws 关键字来申明办法可能会抛出的异样

throws 能够申明办法可能会抛出一个或多个异样,异样之间用 ’,’ 隔开

  • 如果申明的可能会抛出的异样是非受检的,该办法的调用者能够解决也能够不解决。
  • 如果申明的可能会抛出的异样是受检的,该办法的调用者必须进行解决。

用 throw 关键字来手动抛出一个异样,如果手动抛出的异样是一个受检异样,那么必须进行解决

解决形式有两种:

  1. 显示用 try/catch 进行解决(不合理)
  1. 用 throws 向外申明(正当的解决办法)

应捕捉和解决那些已知如何解决的异样,而传递那些不知如何解决的异样。

近期热文举荐:

1.1,000+ 道 Java 面试题及答案整顿(2022 最新版)

2. 劲爆!Java 协程要来了。。。

3.Spring Boot 2.x 教程,太全了!

4. 别再写满屏的爆爆爆炸类了,试试装璜器模式,这才是优雅的形式!!

5.《Java 开发手册(嵩山版)》最新公布,速速下载!

感觉不错,别忘了顺手点赞 + 转发哦!

退出移动版