异常

Java异常机制主要依赖于try,catch,finally,throws,throw五个关键字

java非正常情况分两种:

  异常Exception:

  错误Error:一般指与虚拟机相关的问题,如系统崩溃,虚拟机错误,动态链接失败等,这些错误无法恢复或不可能捕获,导致应用程序中断,通常程序无法处理,不应该用trycatch捕获

java异常分两种:

  CheckedException:程序必须处理,必须try/catch或者throws声明

  RuntimeException:无须处理,无需try/catch或者throws声明

出现异常,系统会自动生成异常对象,如果程序没有为异常准备捕获,则运行时环境终止,java程序也将退出

try catch花括号不能省略,try块里声明的变量是代码块内部变量,只在try块内有效,外部不能访问,catch也不能

异常捕获时,父类异常catch应该在子类异常后面

java7后一个catch可以捕获多种异常:

  捕获多种异常时,多种异常之间使用“|“隔开,

  捕获多种异常时,异常变量有隐式的final修饰,因此不能对异常变量重新赋值

  catch(IndexOutOfBoundsException|NumberFormatException ie){...}

所有异常对象包含的常用方法:

  getMessage():返回该异常的详细描述字符串

  printStackTrace():将该异常的跟踪栈信息输出到标准错误输出

  printStackTrace(PrintStream s):将该异常的跟踪栈信息输出到指定输出流

  getStackTrace():返回该异常的跟踪栈信息

finally用来回收资源,finally中的return和throw语句会导致try/catch中的return和throw失效

System.exit(1)退出虚拟机会让finally得不到执行

异常处理可以嵌套

java7提供可以自动关闭资源的try:

  try关键字后紧跟一堆圆括号,括号里可以声明、初始化一个或多个资源,这里的资源是指那些必须在程序结束时显式关闭的资源(数据库连接,网络连接等),try语句在该语句结束时自动关闭这些资源。

  这些资源必须实现AutoCloseable或者Closeable接口,即实现close()方法

  自动关闭资源的try相当于包含了隐式的finally块(这个finally用于关闭资源),因此这个try语句可以既没有catch块,也没有finally块,如有需要,当然也可以带多个catch块和一个finally块

throws声明一个或多个异常:当前方法不知道如何处理这种过一次类型,交给上一级调用者处理。main方法也可以使用throws声明抛出异常,该异常交给JVM处理,JVM处理方法是:打印异常跟踪栈信息,终止程序运行

throw只能抛出一个异常:

  抛出的是异常实例,不是异常类

  如果throw抛出的是Checked异常,则该throw语句要么处于try块里,要么放在一个带throws声明的方法中

  可以让多个方法协作处理异常

自定义异常类:

  用户自定义异常都应该继承Exception类,如果希望自定义Runtime异常,则应该继承RuntimeException。

  定义异常类时,同常需要提供两个构造器:一个无参数的构造器,一个是带一个字符串参数的构造器,该字符串作为该异常对象的描述信息,也就是getMessage()的返回值

  public class MyException extends Exception{public MyException(){}public MyException(String msg){super(msg);}}

异常跟踪栈:打印出异常一路触发过程,找出源头

异常处理规则:

  目标:

    使代码混乱最小化

    捕获并保留诊断信息

    通知合适的人员

    采用合适的方式结束异常活动

  避免:

    不要过度使用异常,简单的就地解决

    不要使用庞大的try块

    避免使用catch All语句:无法区分异常,重要异常可能被忽略

    不要忽略捕获到的异常:尽量处理,不行重新抛出

原文地址:https://www.cnblogs.com/zawjdbb/p/7067094.html