Java--异常

概念

异常就是程序在编译时发生的意想不到的情况,一般而言分为两类:错误(Error)和异常(Exception)

Java异常类结构图

Error类和Exception类区别

Error类:一般是指虚拟机相关的问题,如系统崩溃,虚拟机出错误等,这种错误无法恢复或不可能捕获,将导致应用程序中断,通常不处理

Expection:Exception 类及其子类是 Throwable 的一种形式,它指出了合理的应用程序想要捕获的条件

​ (1)SQLException:该异常提供关于数据库访问错误或其他错误的信息。

​ (2)RuntimeException` 是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类

​ (3)IOException:此类为异常的通用类,它是由失败的或中断的 I/O 操作生成的。

Exception异常分类

运行异常(RuntimeException)

ArrithmeticException
MissingResourceException
ClassNotFoundException

NullPointerException
lllegalArgumentException
ArrayIndexOutOfBoundsException
UnkownTypeException

非运行时异常(受检查异常类)

EOFException
FileNotFoundException

异常处理机制

抛出异常(throw与throws用法)->捕获异常(处理顺序)->异常传播

throw、throws关键字

throw关键字是用于方法体内部,用来抛出一个Throwable类型的异常。如果抛出了检查异常,则还应该在方法头部声明方法可能抛出的异常类型。该方法的调用者也必须检查处理抛出的异常。如果所有方法都层层上抛获取的异常,最终JVM会进行处理,处理也很简单,就是打印异常消息和堆栈信息。如果抛出 的是Error或RuntimeException,则该方法的调用者可选择处理该异常。有关异常的转译会在下面说明。 throws关键字用于方法体外部的方法声明部分,用来声明方法可能会抛出某些异常。仅当抛出了检查异常,该方法的调用者才必须处理或者重新抛出该异常。 当方法的调用者无力处理该异常的时候,应该继续抛出,而不是囫囵吞枣一般在catch块中打印一下堆栈信息做个勉强处理。下面给出一个简单例子,看看如何 使用这两个关键字:

public static void test3() throws Exception{ //抛出一个检查异常 throw new Exception("方法test3中的Exception"); }

Throwable类中的常用方法

getCause():返回抛出异常的原因。如果 cause 不存在或未知,则返回 null。

getMessage():返回异常的消息信息。 printStackTrace():对象的堆栈跟踪输出至错误输出流,作为字段 System.err 的值。

异常处理的基本语法

在java中,异常处理的完整语法是: try{ //(尝试运行的)程序代码 }catch(异常类型 异常的变量名){ //异常处理代码 }finally{ //异常发生,方法返回之前,总是要执行的代码 }

以上语法有三个代码块: try语句块,表示要尝试运行代码,try语句块中代码受异常监控,其中代码发生异常时,会抛出异常对象。

catch语句块会捕获try代码块中发生的异常并在其代码块中做异常处理,catch语句带一个Throwable类型的参数,表示可捕获异常类型。当 try中出现异常时,catch会捕获到发生的异常,并和自己的异常类型匹配,若匹配,则执行catch块中代码,并将catch块参数指向所抛的异常对 象。catch语句可以有多个,用来匹配多个中的一个异常,一旦匹配上后,就不再尝试匹配别的catch块了。通过异常对象可以获取异常发生时完整的 JVM堆栈信息,以及异常信息和异常发生的原因等。

finally语句块是紧跟catch语句后的语句块,这个语句块总是会在方法返回前执行,而不管是否try语句块是否发生异常。并且这个语句块总是在方 法返回前执行。目的是给程序一个补救的机会。这样做也体现了Java语言的健壮性

try、catch、finally三个语句块应注意的问题

第一、try、catch、finally三个语句块均不能单独使用,三者可以组成 try...catch...finally、try...catch、try...finally三种结构,catch语句可以有一个或多个,finally语句最多一个

第二、try、catch、finally三个代码块中变量的作用域为代码块内部,分别独立而不能相互访问。如果要在三个块中都可以访问,则需要将变量定义到这些块的外面

第三、多个catch块时候,只会匹配其中一个异常类并执行catch块代码,而不会再执行别的catch块,并且匹配catch语句的顺序是由上到下。

posted @ 2024-08-08 08:50  curry库-04049  阅读(12)  评论(0)    收藏  举报