异常 知识点记忆

来源:互联网 发布:景安备案域名购买 编辑:程序博客网 时间:2024/06/11 20:42
异常(Exception)和错误(Error)都继承Throwable父类


Error错误一般指与虚拟机相关(系统崩溃,虚拟机错误,动态链接失败等),应用程序无法处理这些错误,不应catch来捕获
<System.exit(1)使用exit退出虚拟机 使用它finally将不会执行>


Exception异常(checked和Runtime)不是RuntimeException类及子类的异常实例都是Checked异常
Checked优势是提醒程序员代码可能存在的问题,必须注意处理或者声明该异常由该方法调用者对异常进行处理;要么显示捕获在try块里,要么在main中再次抛出


<异常捕获时,先捕获小异常,后捕获大异常> 


异常类型::


IndexOutBoundsException 数组越界:运行程序时输入的参数个数不够


NumberFormatException 数字格式异常:程序只能接受整数参数


ArithMeticException 算数异常


NullPointerException 空指针异常


Exception未知异常


<捕获多种异常时(|)竖线隔开,变量有隐式final修饰,故不能对变量随便赋值;捕获一种异常时候是没有final修饰的>


访问异常信息::


getMessage() 返回异常对象的详细信息


printStackTrace() 将对象的异常跟踪栈信息输出到标准输出


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


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


<避免将return ,throw 放在finally块中,将会出现混乱>


异常处理的嵌套::
自动关闭资源的try语句,避免写在finally里造成代码的臃肿
try()括号里声明,初始化可关闭的资源,将会自动关闭这两个资源,相当于包含了隐式的finally块
<Closeable是AutoCloseable的子接口 ,自动关闭必须实现AutoCloseable 或Closeable接口>
Closeable接口里的close方法只能抛出IOException或其子类
AutoCloseable的close方法抛出Excepotion的任何异常


关于throws::
throws声明抛出紧跟在方法签名后,一旦使用throws,程序无须使用try catch来捕获该异常了!
throws使用限制为子方法抛出的异常不允许比父类方法抛出的异常多!
throws设计思路,当前方法不知道如何处理这异常,该异常由上一级调用者处理,如果main方法也不知道如何处理这异常,也可以
使用throws抛出异常,将异常交给JVM处理,jvm打印跟踪栈信息并终止程序运行


关于throw::
<throw抛出的不是异常类,而是一个异常实例,并且每次只能抛出一个异常实例>
既可以显示捕获该异常也可以完全不理会,把该异常交给该方法的调用者


自定义异常类::
用户自定义异常都应继承Exception基类;自定义Runtime异常,应继承RuntimeException基类,定义时候通常提供一个无参和带一个字符串参数的构造器它作为该异常对象的
描述信息(getMessage())


catch和throw同时使用::
对于有些异常处理需要在该方法的调用者中才能完成,为了实现多个方法同时协作处理同一个异常的情形 catch和throw同用


java7增强的throw语句::
java编译器开始更细致的检查,所以java编译器会检查throw语句抛出异常的实际类型,这样在catch 中throw ex 时排除已抛出的异常


异常链::
程序先捕获原始异常,然后抛出一个新的业务异常,新的业务异常包含了对用户的提示信息称--异常转译
把捕获一个异常然后抛出另一个异常,并把原始异常信息保存下来是一种典型 的链式处理(职责链模式或叫异常链)
Throwable基类有一个可以接受Exception参数的方法,throwable子类构造器有个可以接受cause对象的参数,来表示原始异常,可把原始异常传递给新的异常,如果在当前位置抛出了新的异常,也能通过这个异常链追踪到异常最初发生的位置。


异常跟踪栈::
从开始异常触发到最后传到main方法,在main方法中终止,这个过程就是java的异常跟踪栈
第一行显示异常类型和异常的详细信息
接下来跟踪栈记录程序中所有发生的异常点,显示被调用中执行的停止位置,一行行往下看,跟栈总是在于内部的被调用的方法逐渐往上传。
原创粉丝点击