zoukankan      html  css  js  c++  java
  • java的异常机制面试题(转)

    转自https://www.jianshu.com/p/2b4e02f7fa19

    转自https://www.cnblogs.com/xiaotangtang/p/4904866.html

    https://blog.csdn.net/weixin_42182713/article/details/90739924

    Java 对异常进行了分类,不同类型的异常分别用不同的 Java 类表示,所有异常的根类为 java.lang.Throwable,Throwable 下面又派生了两个子类:Error 和 Exception,Error 表示应用程序本身无法克服和恢复的一种严重问题。
    Exception 表示程序还能够克服和恢复的问题,其中又分为系统异常和普通异常,系统异常是软件本身缺陷所导致的问题,也就是软件开发人员考虑不周所导致的问题,软件使用者无法克服和恢复这种问题,但在这种问题下还可以让软件系统继续运行或者让软件死掉,例如,数组脚本越界(ArrayIndexOutOfBoundsException),空指针异常(NullPointerException)、类转换异常(ClassCastException);普通异常是运行环境的变化或异常所导致的问题,是用户能够克服的问题,例如,网络断线,硬盘空间不够,发生这样的异常后,程序不应该死掉。
    java 为系统异常和普通异常提供了不同的解决方案,编译器强制普通异常必须 try…catch 处理或用 throws 声明继续抛给上层调用方法处理,所以普通异常也称为 checked 异常,而系统异常可以处理也可以不处理,所以,编译器不强制用 try…catch 处理或用 throws 声明,所以系统异常也称为 unchecked 异常。

    1.java异常架构图

    粉红色的是受检查的异常(checked exceptions),其必须被 try{}catch语句块所捕获,或者在方法签名里通过throws子句声明.受检查的异常必须在编译时被捕捉处理,命名为 CHecked Exception 是因为Java编译器要进行检查,Java虚拟机也要进行检查,以确保这个规则得到遵守.
    绿色的异常是运行时异常(runtime exceptions),需要程序员自己分析代码决定是否捕获和处理,比如 空指针,被0除...
    而声明为Error的,则属于严重错误,需要根据业务信息进行特殊处理,Error不需要捕捉。

    2.try{}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?

    也许你的答案是在return之前,但往更细地说,我的答案是在return中间执行,请看下面程序代码的运行结果:

    复制代码
     1 public  classTest {  
     2   
     3     public static void main(String[] args) {  
     4        System.out.println(newTest().test());  
     5     }  
     6     staticint test()  
     7     {  
     8        int x = 1;  
     9        try  
    10        {  
    11            return x;  
    12        }  
    13        finally  
    14        {  
    15            ++x;  
    16        }  
    17     }  
    18 }  
    复制代码

    ---------执行结果 ---------

    运行结果是1,为什么呢?主函数调用子函数并得到结果的过程,好比主函数准备一个空罐子,当子函数要返回结果时,先把结果放在罐子里,然后再将程序逻辑返回到主函数。所谓返回,就是子函数说,我不运行了,你主函数继续运行吧,这没什么结果可言,结果是在说这话之前放进罐子里的。

    3。final, finally, finalize的区别。

      final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。

    内部类要访问局部变量,局部变量必须定义成final类型,例如,一段代码……

    finally是异常处理语句结构的一部分,表示总是执行。

    finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。JVM不保证此方法总被调用

    4.请写出你最常见到的5个runtime exception。

    这道题主要考你的代码量到底多大,如果你长期写代码的,应该经常都看到过一些系统方面的异常,你不一定真要回答出5个具体的系统异常,但你要能够说出什么是系统异常,以及几个系统异常就可以了,当然,这些异常完全用其英文名称来写是最好的,如果实在写不出,那就用中文吧,有总比没有强!

    所谓系统异常,就是…..,它们都是RuntimeException的子类,在jdk doc中查RuntimeException类,就可以看到其所有的子类列表,也就是看到了所有的系统异常。我比较有印象的系统异常有:NullPointerException、ArrayIndexOutOfBoundsException、ClassCastException。

    5.JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?

    Java 通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接口。在 Java 中,每个异常都是一个对象,它是 Throwable 类或其它子类的实例。当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并进行处理。Java 的异常处理是通过 5 个关键词来实现的:try、catch、throw、throws 和 finally。一

    般情况下是用 try 来执行一段程序,如果出现异常,系统会抛出(throws)一个异常,这时候你可以通过它的类型来捕捉(catch)它,或最后(finally)由缺省处理器来处理;

     try 用来指定一块预防所有“异常”的程序;

     catch 子句紧跟在 try 块后面,用来指定你想要捕捉的“异常”的类型;

     throw 语句用来明确地抛出一个“异常”;

     throws 用来标明一个成员函数可能抛出的各种“异常”;

     Finally 为确保一段代码不管发生什么“异常”都被执行一段代码;

     可以在一个成员函数调用的外面写一个 try 语句,    在这个成员函数内部写另一个 try 语句保护其他代码。每当遇到一个 try 语句,“异常”的框架就放到堆栈上面,直到所有的 try 语句都完成。如果下一级的 try 语句没有对某种“异常”进行处理,堆栈就会展开,直到遇到有处理这种“异常”的 try 语句。

    6.运行时异常与一般异常有何异同?

    异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。

    7..下面的程序代码输出的结果是多少?

    public class  smallT{

             public static void  main(String args[]){

                       smallT t  = new smallT();

                       int  b =  t.get();

                       System.out.println(b);

             }

             public int  get()

             {

                       try     {return 1;}

                       finally{return 2;}

             }}

    返回的结果是2。

    我可以通过下面一个例子程序来帮助我解释这个答案,从下面例子的运行结果中可以发现,try中的return语句调用的函数先于finally中调用的函数执行,也就是说return语句先执行,finally语句后执行,所以,返回的结果是2。Return并不是让函数马上返回,而是return语句执行后,将把返回结果放置进函数栈中,此时函数并不是马上返回,它要执行finally语句后才真正开始返回。

    在讲解答案时可以用下面的程序来帮助分析:

    public  class Test {

        public static void main(String[]args) {

            System.out.println(new Test().test());;

        }

        int test()

        {

            try         {return func1();}

            finally    {return func2();}

        }

       

        int func1()

        {

            System.out.println("func1");

            return 1;

        }

        int func2()

        {

            System.out.println("func2");

            return 2;

        }  

    }

    -----------执行结果-----------------

    func1

    func2

    2

    结论:finally中的代码比return 和break语句后执行

     

    引言

    Exception 和 Error 都是继承了Throwable类,在java中只有Throwable的实例才能被抛出或者捕获。
    Error不能恢复java程序也不应该被捕获。
    Exception分为可检查和不可检查的类型,可检查的异常应该在编码期间显式捕获,因为虚拟机会在编译期进行检查。不检查异常是指类似 NullPointerException、ArrayIndexOutOfBoundsException

    深入理解异常

     
    image.png

    Error和Exception都继承于Throwable。

    ClassNotFoundException和NoClassDefFoundError的区别??

    首先NoClassDefFoundError是一个错误(Error),而ClassNOtFoundException是一个异常,ClassNotFoundException的产生原因:
    Java支持使用Class.forName方法来动态地加载类,任意一个类的类名如果被作为参数传递给这个方法都将导致该类被加载到JVM内存中,如果这个类在类路径中没有被找到,那么此时就会在运行时抛出ClassNotFoundException异常。
    另外还有一个导致ClassNotFoundException的原因就是:当一个类已经某个类加载器加载到内存中了,此时另一个类加载器又尝试着动态地从同一个包中加载这个类。
    NoClassDefFoundError产生的原因:
    如果JVM或者ClassLoader实例尝试加载(可以通过正常的方法调用,也可能是使用new来创建新的对象)类的时候却找不到类的定义。要查找的类在编译的时候是存在的,运行的时候却找不到了。这个错误往往是你使用new操作符来创建一个新的对象但却找不到该对象对应的类。这个时候就会导致NoClassDefFoundError.

    处理异常

    1.不要捕获通用异常,而是要捕获特定异常
    2.不要不要生吞异常
    3.Throw early, catch late,尽早在能避免异常的时候抛出异常,然后再处理异常
    4.自定义异常的时候,考虑是否要定义成可检查异常,因为这种异常是考虑到可以从异常中恢复制定的。另外自定义异常的时候考虑尽量不要包含敏感信息
    5.java的异常处理机制中try-catch 阶段会产生额外的开销,影响JVM对代码的优化,不要用异常处理。另外每生成一个异常,jvm都会对当前栈进行快照,(个人理解是:栈快照是栈内操作的集合,用来记录栈操作的

    1. 一个函数尽管抛出了多个异常,但是只有一个异常可被传播到调用端。最后被抛出的异常时唯一被调用端接收的异常,其他异常都会被吞没掩盖。如果调用端要知道造成失败的最初原因,程序之中就绝不能掩盖任何异常。
      7.当遇到return语句的时候,执行函数会立刻返回。但是,在Java语言中,如果存在finally就会有例外。除了return语句,try代码块中的break或continue语句也可能使控制权进入finally代码块。


  • 相关阅读:
    utf8和utf8mb4的区别
    【JSP 标签】选择判断c:choose
    【JSP 标签】格式化日期
    【Spring 核心】AOP 面向切面编程
    【Spring 核心】高级装配
    【Spring 核心】装配bean(三)XML配置
    【Spring 核心】装配bean(二) JavaConfig装配
    【Spring 核心】装配Bean(一) 自动化装配
    【Js应用实例】图片预览
    【Js应用实例】限制上传图片大小
  • 原文地址:https://www.cnblogs.com/ffaiss/p/11434639.html
Copyright © 2011-2022 走看看