java异常和错误共有的超类为Throwable

https://www.cnblogs.com/AbelZone/p/10049997.html

java异常面试题

  • 定义:java提供的一种识别及响应错误的一致性机制

  • 涉及到的关键:try; catch;finally;throw;throws

  • 分类:主要分为两大类:

    • 编译时异常(Exception子类除去RuntimeException以外都是编译时异常):可查异常(编译器要检查的异常,可以提前预知的异常,编译器不通过不能运行的异常)

      • 可以通过try......catch方法通过编译器的检查,或者通过泛型骗过编译器的检查,最终在JVM中运行打印异常)例子如下(idea中的编译器不能骗过,java8的能骗过):

  • 运行时异常(RuntimeException):不可查异常(编译器不会检查的异常,发生的可能性比较低的异常,一般是由程序逻辑问题造成的异常)
  • 针对之前上课听到的所有异常都发生在程序运行的时候的解释:
    • 编译器也能打印异常,这个是编译器行为而不是JVM行为,比如利用泛型骗过编译器,则编译器通过,JVM运行结果是
    • 如果将RuntimeException改成IOException则编译器检查出语法异常,编译器打印异常为:
    • 综上所述:利用try...catch等方法在编译器通过之后,异常的发生都在运行阶段是没有问题的。
  • 面试题
    • finally和finalize和final的区别:在try结构中,无论如何都会执行finally,所以finally的方法体中适合用作释放资源和后续需要处理的代码
    • try{}catch{}finally{}语句结构中如果在try中出现return时,不同情况的分析,表明try中的return已经执行但是因为finally不能立刻结束,所以只进行了i++,最后在finally中执行了return
public static int testReturn(){int i = 0;try {i++;System.out.println("try");return ++i;//这里也执行i++,但是没有进行return}finally {System.out.println("finally");return ++i;//最后在这里结束返回3}//return ++i;   //因为try中有return所以这里不可能被执行到。}

上述方法结论验证了finally无论如何都会执行,return都不能阻止。

public static int testReturn2(){int i = 0;try {i++;System.out.println("try");return ++i;//这里先执行i++,但是没有立刻进行return,// 等finally中的语句执行完毕在执行返回,// 但是因为程序必须由上至下执行随意只能返回2}finally {System.out.println("finally");++i;//finally中已经语句已经执行}}

上述方法结论验证了finally无论如何都会执行,同时遵守了编程语言亘古不变的道理语句是自上而下执行的

  • 异常定义
public class MyselfException extends IOException {public MyselfException(){super();}public MyselfException(String message){super(message);}
}

public  <E extends Throwable> void throwException01(E t) throws E {throw (E)t;//正确的泛型方法}
  • ​​​注意事项

    • 两小一大原则,在编译时异常的条件下,当含有throw的方法重写时,子类的异常必须小于等于父类(子类抛出的异常必须是父类抛出异常的子类或者和父类抛出的异常相同)
    • 异常抓取catch的时候只能是try中的产生的异常类或者是其父类(子类则抓不到),下面这个列子能抓到,是因为抛出对象a本质是Sneeze类,这里发生了向上转型。
class Annoyance extends Exception {
}
class Sneeze extends Annoyance {
}
class Human {public static void main(String[] args)throws Exception {try {try {throw new Sneeze();} catch ( Annoyance a ) {System.out.println("Caught Annoyance");throw a ;}
//            throw new Annoyance();} catch ( Sneeze s ) {//这里能抓住异常是因为存在Sneeze异常System.out.println("Caught Sneeze");return ;} finally {System.out.println("Hello World!");}}
}
/*
Caught Annoyance
Caught Sneeze(这个能被抓住是因为这个对应的try是外面那个里面有两个异常对象)
Hello World!
*/
  • 异常方法处理:

    public static void main(String[] args) {//自动关闭了Scanner开启的流try(Scanner in = new Scanner(new FileInputStream("D:\\IdeaProjects\\basic.code\\object"),"UTF-8")){ArrayList bList = new ArrayList<>();while(in.hasNext()){bList.add(in.next());}String str =  bList.toString();System.out.println(str);}catch(IOException e){e.printStackTrace();}}
    //验证了可以同时关闭多个资源,且相互不影响
    public class Test04Exception   {public static void main(String[] args) {try(MyImplementAutoCloseable a = new MyImplementAutoCloseable();My2ImplementAutoCloseable b = new My2ImplementAutoCloseable()){a.doSome();b.doOther();}catch(IOException e){e.printStackTrace();}}}
    class MyImplementAutoCloseable implements AutoCloseable  {
    public void doSome(){System.out.println("dosome");
    }@Overridepublic void close() throws IOException {System.out.println("doSome资源已经关闭");}
    }
    class My2ImplementAutoCloseable  implements AutoCloseable  {public void doOther(){System.out.println("doOther");}@Overridepublic void close() throws ClassCastException {System.out.println("doOther资源已经关闭");}
    }
    /*输出结果是
    dosome
    doOther
    doOther资源已经关闭
    doSome资源已经关闭
    */
    //使用try-with-resource语句是关闭所有资源之后才捕捉异常的,这保证把所有正常的资源全部关闭
    public class Test04Exception   {public static void main(String[] args) {try(MyImplementAutoCloseable a = new MyImplementAutoCloseable();My2ImplementAutoCloseable b = new My2ImplementAutoCloseable()){//  a.doSome();// b.doOther();}catch(IOException e){e.printStackTrace();//这个最后显示是因为这里调用printStream的时候锁了一定时间,导致一段时间后才打印。System.out.println(e.getMessage());Throwable[] throwArray = e.getSuppressed();//获取被抑制的异常Throwable数组System.out.println(throwArray[0].getMessage());}}}
    class MyImplementAutoCloseable implements AutoCloseable  {
    public void doSome(){//throw new IOException("doSome扔出的异常");System.out.println("dosome");
    }@Overridepublic void close() throws IOException {System.out.println("MyImplementAutoCloseable资源已经关闭");throw new IOException("MyImplementAutoCloseable资源关闭的时候扔出的异常");}
    }
    class My2ImplementAutoCloseable  implements AutoCloseable  {public void doOther(){System.out.println("doOther");}@Overridepublic void close() throws IOException {System.out.println("My2ImplementAutoCloseable资源已经关闭");throw new IOException("My2ImplementAutoCloseable资源关闭的扔出的异常");}
    }/*
    My2ImplementAutoCloseable资源已经关闭
    MyImplementAutoCloseable资源已经关闭
    My2ImplementAutoCloseable资源关闭的扔出的异常
    MyImplementAutoCloseable资源关闭的时候扔出的异常
    java.io.IOException: My2ImplementAutoCloseable资源关闭的扔出的异常at chl.java.TestException.My2ImplementAutoCloseable.close(Test04Exception.java:38)at chl.java.TestException.Test04Exception.main(Test04Exception.java:11)Suppressed: java.io.IOException: MyImplementAutoCloseable资源关闭的时候扔出的异常at chl.java.TestException.MyImplementAutoCloseable.close(Test04Exception.java:28)... 1 more
    */
    • throws抛给上一级
    • try...catch...finally自己处理
    • try-with-resources这是JDK7的新特性,并且在JDK9的时候进行更新(更新后可以直接在try中使用常量资源,不需要在try中声明新的变量)。主要作用就是确保每个资源在语句结束时关闭,避免了在finally中的close方法可能抛出的IOEexception覆盖原始异常使用try-with-resource语句是关闭所有资源之后才捕捉异常的,这保证把所有正常的资源全部关闭。
  • Throwable的另一个子类是Error:比如StackOverflow等,当出现错误时,JVM停止运行,程序员不应该对Error类做处理。

java异常和错误共有的超类为Throwable相关推荐

  1. java测试类和类_【测试开发】从测试角度看Java异常类(错误和异常区别介绍)

    在 Java 中,所有的异常都有一个共同的祖先 Throwable(可抛出).Throwable 指定代码中可用异常传播机制通过 Java 应用程序传输的任何问题的共性. Throwable 有两个重 ...

  2. php throwable,PHP7异常与错误处理机制 Exception, Error, Throwable

    PHP 中的 Exception, Error, ThrowablePHP 中将代码自身异常(一般是环境或者语法**所致)称作错误 Error,将运行**现的逻辑错误称为异常 Exception 错误 ...

  3. java异常及错误处理大纲

    文章目录 1.异常处理 2. 自定义异常 3. 断言及程序的测试 4. 程序的调试 1.异常处理 异常(exception ) 又称为例外.差错.违例 对应着Java运行错误处理机制 基本写法 try ...

  4. java异常分类三大类_JAVA 中异常的分类

    JAVA中的异常可以大体上分为三大类: Error,RuntimeException,Exception 基类Throwable派生的. 使用的方法也是基本一致的,都是通过关键字throw+Throw ...

  5. Java 异常 【钢镚核恒】

    Java 异常 简介 错误在我们编写程序的过程中会经常发生,包括编译期间和运行期间的错误. 异常体系图 异常处理 捕获异常(快捷键 : Ctr l+ Alt + T) // try块后可接零个或多个c ...

  6. 八股文系列:Java中的异常和错误

    Java异常架构与异常关键字 Java异常简介 Java异常是Java提供的一种识别及响应错误的一致性机制. Java异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅,并提高程 ...

  7. 深入探讨Java中的异常与错误处理

    Java中的异常处理机制已经比较成熟,我们的Java程序到处充满了异常的可能,如果对这些异常不做预先的处理,那么将来程序崩溃就无从调试,很难找到异常所在的位置.本文将探讨一下Java中异常与错误的处理 ...

  8. java的常见异常与错误总结

    算术异常类:ArithmeticExecption 空指针异常类:NullPointerException 类型强制转换异常:ClassCastException 数组负下标异常:NegativeAr ...

  9. java学习中,异常和错误的简介、捕获异常、抛出异常、自定义异常、finally关键字(java 学习中的小记录)

    java学习中,异常和错误的简介.捕获异常.抛出异常.自定义异常.finally关键字(java 学习中的小记录) 参考文章: (1)java学习中,异常和错误的简介.捕获异常.抛出异常.自定义异常. ...

最新文章

  1. mysql,简单介绍一下索引
  2. 安卓MP3播放器开发实例(3)之进度条和歌词更新的实现
  3. 4、Cocos2dx 3.0三,找一个小游戏开发Hello World 分析
  4. 前端学习(235):css HACK
  5. 白鹭php源码,白鹭/CDNDrive
  6. phpcms 怎样实现PC端、手机端的双模版
  7. iOS 11之Vision人脸检测
  8. Windows创建的基本含义和进程的进程的内核
  9. smbclient用法
  10. OFFICE技术讲座:中文标点符号有哪些
  11. DirectX修复工具(DirectX Repair)修复工具V4.0增强版
  12. .fit VS .fit_generator in Keras
  13. Linux 虚拟机VMware安装失败,提示没有选择磁盘no disks selected
  14. dw中css目标规则命名,CSS名规则.doc
  15. TOEFL wordlist 9
  16. cesium教程-3(显示高度,海拔,经度,纬度)
  17. Charles抓包显示<unknown>解决方案
  18. 设计模式-创建型模式:原型模式PrototypeModel
  19. Linux获取系统UUID
  20. 关于EDP触摸屏使用笔记

热门文章

  1. android签到功能开发,Android应用开发之Android简单实现app每月签到功能
  2. 基于VB编写的电力电缆载流量计算
  3. windows修改远程端口
  4. 以解决城市交通堵塞问题为中心来玩头脑风暴吧
  5. ROOT【个人学习,慎用】
  6. Android Stuido 配置2.8版本Genymotion步骤
  7. 十年风雨,一个普通程序员的成长之路(九)一眼望到头,一眼望不到头
  8. 1.2 选择组网模式
  9. SQLSERVER2005的10054错误在Windows Server 2003 SP1上的解决办法
  10. 竞赛水题:通关密码。