1.Java异常概念

运行期出现的错误

观察错误的名字和行号最重要

Java SE 04 异常处理

Java SE 04 异常处理

2.Java异常的分类

Java SE 04 异常处理

Java SE 04 异常处理

3.异常的捕获和处理

Java SE 04 异常处理

Java SE 04 异常处理

Java SE 04 异常处理

Java SE 04 异常处理

Java SE 04 异常处理

main方法throws异常就会交由运行时系统进行处理打印。(不推荐,main方法中应对异常进行try,catch捕获)

Java SE 04 异常处理

Java SE 04 异常处理

Java SE 04 异常处理

4总结

一个图

(Throwable、Error、Exception、RuntimeException)

五个关键字

(try catch finally throw throws)

多个catch先捕获小的再捕获大的:

(在一个try语句块中,基类异常的捕获语句不可以写在子类异常捕获语句的上面。)

异常与重写的方法

(重写方法需要抛出与原方法所抛异常类型一致异常或不抛出异常。)


7.1异常概述


1.所有异常的父类是?所有异常都在哪个包里?所有异常分为几种类型?


Java 语言定义了一些异常类在java.lang 标准包中。

所有的异常类是从 java.lang.Exception 类继承的子类。

Exception 类是Throwable 类的子类。除了Exception类外,Throwable还有一个子类Error 。

Java 程序通常不捕获错误。错误一般发生在严重故障时,它们在Java程序处理的范畴之外。

Error 用来指示运行时环境发生的错误。

例如,JVM 内存溢出。一般地,程序不会从错误中恢复。

异常类有两个主要的子类:IOException 类和 RuntimeException 类。

Java SE 04 异常处理

在 Java 内置类中,有大部分常用检查性和非检查性异常。


2.   从编程角度异常又分为哪两种?各自的含义及常用异常类有哪些?


通常,Java的异常(包括Exception和Error)分为可查的异常(checked exceptions)和不可查的异常(uncheckedexceptions)。

     可查异常(编译器要求必须处置的异常):正确的程序在运行中,很容易出现的、情理可容的异常状况。可查异常虽然是异常状况,但在一定程度上它的发生是可以预计的,而且一旦发生这种异常状况,就必须采取某种方式进行处理。

     除了RuntimeException及其子类以外,其他的Exception类及其子类都属于可查异常。这种异常的特点是Java编译器会检查它,也就是说,当程序中可能出现这类异常,要么用try-catch语句捕获它,要么用throws子句声明抛出它,否则编译不会通过。


     不可查异常(编译器不要求强制处置的异常):包括运行时异常(RuntimeException与其子类)和错误(Error)。

    Exception 这种异常分两大类运行时异常和非运行时异常(编译异常)。程序中应当尽可能去处理这些异常。

      运行时异常:都是RuntimeException类及其子类异常,如NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。

      运行时异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过。

      非运行时异常 (编译异常):是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常。


3.Java的异常处理机制有几种?


在 Java 应用程序中,异常处理机制为:抛出异常,捕捉异常。



7.2 捕获异常


1.异常捕获的语句有哪些?异常捕获的目的是什么?如何捕获异常?


捕获异常:在方法抛出异常之后,运行时系统将转为寻找合适的异常处理器(exception handler)。

捕获异常:try、catch 和 finally

try 块:用于捕获异常。其后可接零个或多个catch块,如果没有catch块,则必须跟一个finally块。

catch 块:用于处理try捕获到的异常。

finally 块:无论是否捕获或处理异常,finally块里的语句都会被执行。当在try块或catch块中遇到return语句时,finally语句块将在方法返回之前被执行。

如何释放物理资源?

Close


2.   什么情况下,finally语句块会执行,什么情况下不会执行?


当程序执行try块,catch块时遇到return语句或者throw语句,这两个语句都会导致该方法立即结束,所以系统并不会立即执行这两个语句,而是去寻找该异常处理流程中的finally块,如果没有finally块,程序立即执行return语句或者throw语句,方法终止。如果有 finally块,系统立即开始执行finally块,只有当finally块执行完成后,系统才会再次跳回来执行try块、catch块里的 return或throw语句,如果finally块里也使用了return或throw等导致方法终止的语句,则finally块已经终止了方法,不用 再跳回去执行try块、catch块里的任何代码了。

在以下4种特殊情况下,finally块不会被执行:

1)在finally语句块中发生了异常。

2)在前面的代码中用了System.exit()退出程序。

3)程序所在的线程死亡。

4)关闭CPU。

 

3.trycatchfinallythrowthrows的作用分别是什么?多catch语句之间的执行顺序?


使用 try 和 catch 关键字可以捕获异常。try/catch 代码块放在异常可能发生的地方。

try/catch代码块中的代码称为保护代码,使用 try/catch 的语法如下:

try

{

   //程序代码

}catch(ExceptionName e1)

{

  //Catch 块

}

Catch 语句包含要捕获异常类型的声明。当保护代码块中发生一个异常时,try 后面的 catch 块就会被检查。

如果发生的异常包含在 catch 块中,异常会被传递到该 catch 块,这和传递一个参数到方法是一样。

 

一个 try 代码块后面跟随多个catch 代码块的情况就叫多重捕获。

多重捕获块的语法如下所示:

try{

   //程序代码

}catch(异常类型1 异常的变量名1){

  // 程序代码

}catch(异常类型2 异常的变量名2){

  // 程序代码

}catch(异常类型2 异常的变量名2){

  // 程序代码

}

上面的代码段包含了 3 个 catch块。

可以在 try 语句后面添加任意数量的catch 块。

如果保护代码中发生异常,异常被抛给第一个 catch 块。

如果抛出异常的数据类型与 ExceptionType1 匹配,它在这里就会被捕获。

如果不匹配,它会被传递给第二个 catch 块。

如此,直到异常被捕获或者通过所有的 catch 块。

 

如果一个方法没有捕获一个检查性异常,那么该方法必须使用 throws 关键字来声明。throws 关键字放在方法签名的尾部。

也可以使用 throw 关键字抛出一个异常,无论它是新实例化的还是刚捕获到的。

下面方法的声明抛出一个 RemoteException 异常:

[java] view plain copy
  1. import java.io.*;  
  2. public class className  
  3. {  
  4.  public void deposit(double amount) throws RemoteException  
  5.   {  
  6.    // Method implementation  
  7.    throw new RemoteException();  
  8.   }  
  9.  //Remainder of class definition  
  10. }  

一个方法可以声明抛出多个异常,多个异常之间用逗号隔开。

 

finally 关键字用来创建在try 代码块后面执行的代码块。

无论是否发生异常,finally 代码块中的代码总会被执行。

在 finally 代码块中,可以运行清理类型等收尾善后性质的语句。

finally 代码块出现在catch 代码块最后,语法如下:

try{

  // 程序代码

}catch(异常类型1 异常的变量名1){

  // 程序代码

}catch(异常类型2 异常的变量名2){

  // 程序代码

}finally{

  // 程序代码

}



7.3抛出异常


1.什么是抛出异常?什么情况下需要抛出异常?抛出异常后如何处理?


抛出异常:当一个方法出现错误引发异常时,方法创建异常对象并交付运行时系统,异常对象中包含了异常类型和异常出现时的程序状态等异常信息。运行时系统负责寻找处置异常的代码并执行。

抛出异常:throw、 throws



7.4自定义异常


1.如何自定义异常?自定义的异常如何处理?


编写自己的异常类时需要记住下面的几点。

所有异常都必须是 Throwable 的子类。

如果希望写一个检查性异常类,则需要继承 Exception 类。

如果你想写一个运行时异常类,那么需要继承 RuntimeException 类。

可以像下面这样定义自己的异常类:

class MyException extends Exception{

}

只继承Exception 类来创建的异常类是检查性异常类。

一个异常类和其它任何类一样,包含有变量和方法。



相关文章: