• 面试简单整理之异常


    74.throw 和 throws 的区别?

    throw语句用在方法体内,表示抛出异常,由方法体内的语句处理。
    throws语句用在方法声明后面,表示再抛出异常,由该方法的调用者来处理。
    
    throws主要是声明这个方法会抛出这种类型的异常,使它的调用者知道要捕获这个异常。
    throw是具体向外抛异常的动作,所以它是抛出一个异常实例。
    
    throws说明你有那个可能,倾向。
    throw的话,那就是你把那个倾向变成真实的了。
    
    同时:
    1、throws出现在方法函数头;而throw出现在函数体。
    2、throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常。
    3、两者都是消极处理异常的方式(这里的消极并不是说这种方式不好),只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。
    View Code

    75.final、finally、finalize 有什么区别?

    final 是用来修饰类、方法、属性的;
    1.1 修饰类
      当用final修饰类的时,表明该类不能被其他类所继承。当我们需要让一个类永远不被继承,此时就可以用final修饰,但要注意:
    final类中所有的成员方法都会隐式的定义为final方法。
    
    1.2 修饰方法
    使用final方法的原因主要有两个:
      (1) 把方法锁定,以防止继承类对其进行更改。
      (2) 效率,在早期的java版本中,会将final方法转为内嵌调用。但若方法过于庞大,可能在性能上不会有多大提升。因此在最近版本中,不需要final方法进行这些优化了。
    final方法意味着“最后的、最终的”含义,即此方法不能被重写。
    注意:若父类中final方法的访问权限为private,将导致子类中不能直接继承该方法,因此,此时可以在子类中定义相同方法名的函数,此时不会与重写final的矛盾,而是在子类中重新地定义了新方法。
    1.3 修饰变量
       final成员变量表示常量,只能被赋值一次,赋值后其值不再改变。
    finally 
    finally作为异常处理的一部分,它只能用在try/catch语句中,并且附带一个语句块,表示这段语句最终一定会被执行(不管有没有抛出异常),经常被用在需要释放资源的情况下。
    
     finalize  
    
      finalize()是在java.lang.Object里定义的,也就是说每一个对象都有这么个方法。这个方法在gc启动,该对象被回收的时候被调用。其实gc可以回收大部分的对象(凡是new出来的对象,gc都能搞定,一般情况下我们又不会用new以外的方式去创建对象),所以一般是不需要程序员去实现finalize的。 
    特殊情况下,需要程序员实现finalize,当对象被回收的时候释放一些资源,比如:一个socket链接,在对象初始化时创建,整个生命周期内有效,那么就需要实现finalize,关闭这个链接。 
      使用finalize还需要注意一个事,调用super.finalize();
      一个对象的finalize()方法只会被调用一次,而且finalize()被调用不意味着gc会立即回收该对象,所以有可能调用finalize()后,该对象又不需要被回收了,然后到了真正要被回收的时候,因为前面调用过一次,所以不会调用finalize(),产生问题。 所以,推荐不要使用finalize()方法,它跟析构函数不一样。
    View Code

    76.try-catch-finally 中哪个部分可以省略?

    1)  必须在 try 之后添加 catchfinally 块。try 块后可同时接 catchfinally 块,但至少有一个块。
    
    2) 必须遵循块顺序:若代码同时使用 catchfinally 块,则必须将 catch 块放在 try 块之后。 
    3) catch 块与相应的异常类的类型相关。 
    4) 一个 try 块可能有多个 catch 块。若如此,则执行第一个匹配块。即Java虚拟机会把实际抛出的异常对象依次和各个catch代码块声明的异常类型匹配,如果异常对象为某个异常类型或 其子类的实例,就执行这个catch代码块,不会再执行其他的 catch代码块 
    5) 可嵌套 try-catch-finally 结构。 
    6) 在 try-catch-finally 结构中,可重新抛出异常。 
    7) 除了下列情况,总将执行 finally 做为结束: JVM 过早终止(调用 System.exit(int));在 finally 块中抛出一个未处理的异常;计算机断电、失火、或遭遇病毒攻击
    View Code

    77.try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?

     不管有没有捕获到异常,finally中的代码块均会被执行 
    - finally是在return之后执行的,程序在执行完return之后,会将值保存起来,当执行完finally中的代码块之后,再将return的值进行返回 
    - *如果finally中存在return时,会导致最终返回的结果,就是finally中的值,而不会是try或者catch中的值 
    - 如果在finally中存在return时,会导致程序提前退出
    View Code

    78.常见的异常类有哪些?

    1.Throwable是所有异常类的超类,分为Error 错误和exception 异常。
    2.Error(错误):
    一般是指java虚拟机相关的问题,如系统崩溃、虚拟机出错误、动态链接失败等,这种错误无法恢复或不可能捕获,将导致应用程序中断,通常应用程序无法处理这些错误,因此应用程序不应该捕获Error对象,也无须在其throws子句中声明该方法抛出任何Error或其子类。
    3.Exception:
    Exception类及其子类是Throwable的一种形式,它指出了合理的应用程序想要捕获的条件
    (1)SQLException:该异常提供关于数据库访问错误或其他错误的信息。
    (2)RuntimeException 是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类
    (3)IOException:此类为异常的通用类,它是由失败的或中断的 I/O 操作生成的。
    
    其中异常类Exception又分为运行时异常(RuntimeException)和非运行时异常,这两种异常有很大的区别,也称之为不检查异常(Unchecked Exception)和检查异常(Checked Exception)。
    
    4、运行时异常和非运行时异常
    (1)运行时异常都是RuntimeException类及其子类异常,如NullPointerException、IndexOutOfBoundsException等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。
    
    (2)非运行时异常是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常。
    View Code

  • 相关阅读:
    移动端注意
    每日日报
    每日日报
    每日日报
    每日日报
    每日日报
    每日日报
    每日日报
    每日日报
    每日日报
  • 原文地址:https://www.cnblogs.com/nzxj/p/10470378.html
Copyright © 2020-2023  润新知