Java面试题3:Java异常篇

  • 1、finally 块中的代码什么时候被执⾏?
  • 答:
    在 Java 语⾔的异常处理中,finally 块的作⽤就是为了保证⽆论出现什么情况,finally 块⾥的代码⼀定会被执⾏。
    由于程序执⾏ return 就意味着结束对当前函数的调⽤并跳出这个函数体,因此任何语句要执⾏都只能在 return 前
    执⾏(除⾮碰到 exit 函数),因此 finally 块⾥的代码也是在 return 之前执⾏的。
    此外,如果 try-finally 或者 catch-finally 中都有 return,那么 finally 块中的 return 将会覆盖别处的 return 语
    句,最终返回到调⽤者那⾥的是 finally 中 return 的值。
    ————————————————————————————————————————————
  • 2、finally 是不是⼀定会被执⾏到?
  • 答:
    不⼀定。下⾯列举两种执⾏不到的情况:
    (1)当程序进⼊ try 块之前就出现异常时,会直接结束,不会执⾏ finally 块中的代码;
    (2)当程序在 try 块中强制退出时也不会去执⾏ finally 块中的代码,⽐如在 try 块中执⾏ exit ⽅法。
    —————————————————————————————————————————————
  • 3、try-catch-finally 中,如果 catch 中 return 了,finally 还会执⾏
    吗?
  • 答:
    会。程序在执⾏到 return 时会⾸先将返回值存储在⼀个指定的位置,其次去执⾏ finally 块,最后再返回。因此,
    对基本数据类型,在 finally 块中改变 return 的值没有任何影响,直接覆盖掉;⽽对引⽤类型是有影响的,返回的
    是在 finally 对 前⾯ return 语句返回对象的修改值。
    ——————————————————————————————————————————————
  • 4、try-catch-finally 中那个部分可以省略?
  • 答:
    catch 可以省略。try 只适合处理运⾏时异常,try+catch 适合处理运⾏时异常+普通异常。也就是说,如果你只⽤
    try 去处理普通异常却不加以 catch 处理,编译是通不过的,因为编译器硬性规定,普通异常如果选择捕获,则必
    须⽤ catch 显示声明以便进⼀步处理。⽽运⾏时异常在编译时没有如此规定,所以 catch 可以省略,你加上 catch
    编译器也觉得⽆可厚⾮。
    ————————————————————————————————————————————————
  • 5、Error 和 Exception 的区别?
  • 答:
    Error 类和 Exception 类的⽗类都是 Throwable 类。主要区别如下:
    Error 类: ⼀般是指与虚拟机相关的问题,如:系统崩溃、虚拟机错误、内存空间不⾜、⽅法调⽤栈溢出等。这类
    错误将会导致应⽤程序中断,仅靠程序本身⽆法恢复和预防;
    Exception 类:分为运⾏时异常和受检查的异常。
    ——————————————————————————————————————————————————
  • 6、运⾏时异常与受检异常有何异同?
  • 答:
    运⾏时异常:如:空指针异常、指定的类找不到、数组越界、⽅法传递参数错误、数据类型转换错误。可以编译通
    过,但是⼀运⾏就停⽌了,程序不会⾃⼰处理;
    受检查异常:要么⽤ try … catch… 捕获,要么⽤ throws 声明抛出,交给⽗类处理。
    ——————————————————————————————————————————————————
  • 7、throw 和 throws 的区别?
  • 答:
    (1)throw:在⽅法体内部,表示抛出异常,由⽅法体内部的语句处理;throw 是具体向外抛出异常的动作,所
    以它抛出的是⼀个异常实例;
    (2)throws:在⽅法声明后⾯,表示如果抛出异常,由该⽅法的调⽤者来进⾏异常的处理;表示出现异常的可能
    性,并不⼀定会发⽣这种异常。
    ————————————————————————————————————————————————————
  • 8、常⻅的异常类有哪些?
  • 答:
    NullPointerException:当应⽤程序试图访问空对象时,则抛出该异常。
    SQLException:提供关于数据库访问错误或其他错误信息的异常。
    IndexOutOfBoundsException:指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出。
    FileNotFoundException:当试图打开指定路径名表示的⽂件失败时,抛出此异常。
    IOException:当发⽣某种 I/O 异常时,抛出此异常。此类是失败或中断的 I/O 操作⽣成的异常的通⽤类。
    ClassCastException:当试图将对象强制转换为不是实例的⼦类时,抛出该异常。
    IllegalArgumentException:抛出的异常表明向⽅法传递了⼀个不合法或不正确的参数。
    ————————————————————————————————————————————————————
  • 9、主线程可以捕获到⼦线程的异常吗?
  • 答:
    线程设计的理念:“线程的问题应该线程⾃⼰本身来解决,⽽不要委托到外部”。
    正常情况下,如果不做特殊的处理,在主线程中是不能够捕获到⼦线程中的异常的。如果想要在主线程中捕获⼦线
    程的异常,我们可以⽤如下的⽅式进⾏处理,使⽤ Thread 的静态⽅法
Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandle());

——————————————————————————————————————————

  • 10、Java中怎么分异常?
  • 答:
  • 所谓异常是指程序在运行过程中发生的一些不正常事件。(如:除0溢出,数组下标越界,所读取的文件不存在)
    异常又可以分为:编译时异常,运行时异常
    ————————————————————————————————————————————
  • 11、异常的处理机制有哪几种?
  • 答:
    异常捕捉:try…catch…finally,异常抛出:throws。
    —————————————————————————————————————————————
  • 12、try catch fifinally,try里有return,finally还执行么?
  • 答:
    执行,并且finally的执行早于try里面的return
    结论:
    1.不管有木有出现异常,finally块中代码都会执行;
    2.当try和catch中有return时,finally仍然会执行;
    3.finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的;
    4.finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。
    —————————————————————————————————————————————————
  • 13、 Excption与Error包结构请解释一下。
  • 答:
    Java可抛出(Throwable)的结构分为三种类型:被检查的异常(CheckedException),运行时异常
    (RuntimeException),错误(Error)。
    1.运行时异常
    定义:RuntimeException及其子类都被称为运行时异常。
    特点:Java编译器不会检查它。也就是说,当程序中可能出现这类异常时,倘若既"没有通过throws声明抛出它",也"没有用try-catch语句捕
    获它",还是会编译通过。例如,除数为零时产生的ArithmeticException异常,数组越界时产生的IndexOutOfBoundsException异常,failfast机制产生的ConcurrentModi?cationException异常(java.util包下面的所有的集合类都是快速失败的,“快速失败”也就是fail-fast,它是
    Java集合的一种错误检测机制。当多个线程对集合进行结构上的改变的操作时,有可能会产生fail-fast机制。记住是有可能,而不是一定。
    例如:假设存在两个线程(线程1、线程2),线程1通过Iterator在遍历集合A中的元素,在某个时候线程2修改了集合A的结构(是结构上面的修改,而不是简单的修改集合元素的
    内容),那么这个时候程序就会抛出ConcurrentModi?cationException 异常,从而产生fail-fast机制,这个错叫并发修改异常。Fail-safe,java.util.concurrent包下面的所有的类都是安全失败的,在遍历过程中,如果已经遍历的数组上的内容变化了,迭代器不会抛出
    ConcurrentModi?cationException异常。如果未遍历的数组上的内容发生了变化,则有可能反映到迭代过程中。这就是
    ConcurrentHashMap迭代器弱一致的表现。ConcurrentHashMap的弱一致性主要是为了提升效率,是一致性与效率之间的一种权衡。要成为强一致性,就得到处使用锁,甚至是全局锁,这就与Hashtable和同步的HashMap一样了。)等,都属于运行时异常。
    常见的五种运行时异常:
    ClassCastException(类转换异常)
    IndexOutOfBoundsException(数组越界)
    NullPointerException(空指针异常)
    ArrayStoreException(数据存储异常,操作数组是类型不一致)
    Bu?erOver?owException
    2.被检查异常
    定义:Exception类本身,以及Exception的子类中除了"运行时异常"之外的其它子类都属于被检查异常。特点 : Java编译器会检查它。此类异常,要么通过throws进行声明抛出,要么通过try-catch进行捕获处理,否则不能通过编译。例如,CloneNotSupportedException就属于被
    检查异常。当通过clone()接口去克隆一个对象,而该对象对应的类没有实现Cloneable接口,就会抛出CloneNotSupportedException异常。被检查异常通常都是可以恢复的。
    如:
    IOException
    FileNotFoundException
    SQLException
    被检查的异常适用于那些不是因程序引起的错误情况,比如:读取文件时文件不存在引发的FileNotFoundException 。然而,不被检查的异
    常通常都是由于糟糕的编程引起的,比如:在对象引用时没有确保对象非空而引起的 NullPointerException 。
    3.错误
    定义 : Error类及其子类。
    特点 : 和运行时异常一样,编译器也不会对错误进行检查。当资源不足、约束失败、或是其它程序无法继续运行的条件发生时,就产生错误。程序本身无法修复这些错误的。例如,VirtualMachineError就属于错误。出现这种错误会导致程序终止运行。OutOfMemoryError、ThreadDeath。
    Java虚拟机规范规定JVM的内存分为了好几块,比如堆,栈,程序计数器,方法区等。
    ————————————————————————————————————————————
  • 14、final, finally, finalize的区别。
  • 答:
    final用于声明属性,方法和类,分别表示属性不可交变,方法不可覆盖,类不可继承。
    finally是异常处理语句结构的一部分,表示总是执行。
    finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,供垃圾收集时的其他资源回收,例如关闭文件等。
    —————————————————————————————————————————————
  • 15、Java中的异常处理机制的简单原理和应用。
  • 答:
    当JAVA程序违反了JAVA的语义规则时,JAVA虚拟机就会将发生的错误表示为一个异常。违反语义规则包括2种情况。一种是JAVA类库内置的语义检查。例如数组下标越界,会引发IndexOutOfBoundsException;访问null的对象时会引发NullPointerException。另一种情况就是JAVA允许程序员扩展这种语义检查,程序员可以创建自己的异常,并自由选择在何时用throw关键字引发异常。所有的异常都是java.lang.Thowable的子类。
    ——————————————————————————————————————————
  • 16、编程题:
  • 在这里插入图片描述
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员洲洲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值