Java SE 04 异常处理

本文详细介绍了Java中的异常处理机制,包括异常的概念、分类、捕获和处理方式等内容,并讲解了如何自定义异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.Java异常概念

运行期出现的错误

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

2.Java异常的分类

3.异常的捕获和处理


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

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 内置类中,有大部分常用检查性和非检查性异常。


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 类来创建的异常类是检查性异常类。

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值