博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java学习——异常处理
阅读量:4981 次
发布时间:2019-06-12

本文共 3051 字,大约阅读时间需要 10 分钟。

 类 

Throwable类

      Java 语言中所有错误或异常的超类。只有当对象是此类(或其子类之一)的实例时,才能通过 Java 虚拟机或者 Java throw语句抛出。类似地,只有此类或 其子类之一才可以是 catch子句中的参数类型。

  1. Exception子类(异常)
  2. Error子类(错误):合理的应用程序不应该试图捕获的严重问题

Exception+Error

      Java规定:对于可查异常必须捕捉、或者声明抛出允许忽略不可查的RuntimeException和Error

  1. 可查
    • Exception中除RuntimeException以外
    • 需要用try-catch捕获或者用throws子句声明抛出
  2. 不可查
    • RuntimeExceiption+错误
    • 编译器不要求强制处理

Exception

  • 运行时异常RuntimeException)
    • 可以捕获处理,也可以不处理,可以由虚拟机接管。由运行时系统自动抛出,不需要使用throw语句。
    • 常见的有:

      ClassCastException(类转换异常)

      IndexOutOfBoundsException(数组越界)

      NullPointerException(空指针)

      ArrayStoreException(数据存储异常,操作数组时类型不一致)

      BufferOverflowException(IO操作中缓存溢出异常)

  • 非运行时异常(编译异常)必须进行处理的异常,如果不处理,则编译不能通过

 try-catch捕获 

1 try{2     //可能抛出异常的代码3 }catch(Exception1 e1){4     //处理异常5 }catch(Exception2 e2){6     //一般Exception2是Exception1的父类7 }
  • 匹配原则:如果抛出的异常对象属于catch子句的异常类或该类的子类,则认为生成的异常对象与catch块捕获的异常类型相匹配
  • try没有捕获到异常时:try语句块中的语句逐一被执行,程序将跳过catch语句块,执行finally语句块和其后的语句
  • try捕获到异常catch语句块里没有处理此异常的情况:此异常将会抛给JVM处理,执行finally语句,但finally后的语句不会被执行 
  • try捕获到异常catch语句块里有处理此异常的情况
    • 在try语句块中是按照顺序来执行的,当执行到某一条语句出现异常时,程序将跳到catch语句块
    • 与catch语句块逐一匹配,找到与之对应的处理程序,其他的catch语句块将不会被执行
    • try语句块中,出现异常之后的语句也不会被执行
    • catch语句块执行完后,执行finally语句块里的语句,最后执行finally语句块后的语句

 finally语句 

1 try{2     //可能抛出异常的代码3 }catch(Exception e){4     //处理异常5 }finally{6     //最后会执行的代码7 }

finally块

  • 无论是否捕获或处理异常,finally块里的语句都会被执行
  • 当在try块或catch块遇到return语句时,finally语句块将在方法返回之前被执行
  • 可嵌套try-catch-finally 结构,也就是在 try-catch-finally 结构中,可重新抛出异常
  • 在finally中不要用return,否则会发生异常丢失。(下面是相关的一个小例子)
1 class ExceptionTest{ 2     public static void fun_2() throws Exception{ 3         try{ 4             System.out.println("fun_2 try"); 5             throw new Exception(); 6         }catch(Exception e){ 7             System.out.println("fun_2 catch"); 8             throw e;//向fun_1再次抛出异常 9         }finally{10             System.out.println("fun_2 finally");11             return;//导致异常丢失,fun_1不会捕捉到异常12         }13     }14     public static void fun_1() throws Exception{15         try{16             System.out.println("fun_1 try");17             fun_2();//fun_2中抛出异常18         }catch(Exception e){
//这里不会捕捉到异常19 System.out.println("fun_1 catch");20 throw e;21 }22 }23 public static void main(String[] args) { 24 try{ 25 fun_1(); 26 System.out.println("main try end");27 }catch (Exception e) { 28 e.printStackTrace(); 29 System.out.println("main catch");30 } 31 } 32 }
View Code

执行结果:

fun_1 try         

fun_2 try         

fun_2 catch     

fun_2 finally    

main try end   

  • 在以下4种特殊情况下,finally块不会被执行
    • 在finally语句块中发生了异常
    • 在前面的代码中用了System.exit()退出程序
    • 程序所在的线程死亡
    • 关闭CPU

 throws抛出异常 

  • 如果一个方法可能会出现异常,但没有能力处理这种异常,可以在方法声明处用throws子句来声明抛出异常
  • throws语法格式为:void funname(type parameter) throws Exception1,Exception2,..,ExceptionN (异常列表)
  • 抛出异常语句throw new Exception("Wrong")。如果该语句不在try语句块中,则该方法必须声明抛出异常,否则就是没有被捕获的异常
  • 方法抛出异常列表的异常时,方法不处理这些类型及其子类类型的异常,而抛向调用该方法的方法,由它去处理
  • throws关键字将异常抛给调用后,调用者必须处理;如果调用者不想处理该异常,应该继续向上抛出
  • 调用方法必须遵循任何可查异常的处理和声明规则。若覆盖一个方法,则不能声明与覆盖方法不同的异常。声明的任何异常必须是被覆盖方法所声明异常的同类或子类

转载于:https://www.cnblogs.com/coolqiyu/p/6579825.html

你可能感兴趣的文章
[React] Create a Query Parameter Modal Route with React Router
查看>>
[Algorithm] Tree Width with Level Width
查看>>
[GraphQL] Set variable and default value & alias
查看>>
[Dart] final vs const
查看>>
[GraphQL] Reuse GraphQL Selection Sets with Fragments
查看>>
[GraphQL] Query GraphQL Interface Types in GraphQL Playground
查看>>
[Javascript] Convert a forEach method to generator
查看>>
[Flutter] Stack Layout
查看>>
[GraphQL] Query Lists of Multiple Types using a Union in GraphQL
查看>>
[Angular] Lazy Load CSS at runtime with the Angular CLI
查看>>
[Javascript] Create an Image with JavaScript Using Fetch and URL.createObjectURL
查看>>
[Functional Programming] liftA2 and converge
查看>>
Define Interfaces and Share Class Members through Mixins in Dart
查看>>
[SCSS] SASS dynamic class properties
查看>>
[Angular 8] Lazy loading with dynamic loading syntax
查看>>
[Cypress] install, configure, and script Cypress for JavaScript web applications -- part4
查看>>
[Angular 8] Implement a Custom Preloading Strategy with Angular
查看>>
[Dart] Understand Classes and Inheritance in Dart
查看>>
[Angular] Using Pipe for function memoization
查看>>
[Angular 8] Custom Route Preloading with ngx-quicklink and Angular
查看>>