Java之异常和异常处理机制

异常简介

程序运行时,发生的错误事件阻止了程序按照预期正常执行,这就是异常。

异常处理机制简介

异常发生时,按照代码的预先设定的异常处理逻辑,针对性地处理异常,让程序尽可能正常执行。

Java中的异常可以是函数中的语句执行时引发的,也可以是程序员通过throw语句手动抛出的,异常对象来封装异常,JRE就会试图寻找异常处理程序来处理异常。

Throwable类

Java异常类型的顶层父类,Throwable又派生出Error类和Exception类

1、Error(错误)类表示了JVM本身的错误,错误不能被程序员通过代码处理,Error很少出现。
2、Exception类表示程序运行时发生的错误事件。可以被Java异常处理机制使用,是异常处理的核心。

编译时异常

java认为checked异常都是可以再编译阶段被处理的异常,所以它强制程序处理所有的checked异常,java程序必须显式处理checked异常,如果程序没有处理,则在编译时会发生错误,无法通过编译。

运行时异常

在编译的过程中,Runtime异常无须处理也可以通过编译。所有的Runtime异常原则上都可以通过纠正代码来避免。

java的异常类对象的一些方法

  • getMessage():返回该异常的详细描述字符 
  • printStackTrace():将该异常的跟踪栈信息输出到标准错误输出(异常链) 
  • printStackTrace(PrintStream s):将该异常的跟踪栈信息输出到指定的输出流 
  • getStackTrace():返回该异常的跟踪栈信息

异常处理的基本语法

try…catch…finally语句块处理

try{
	 /**
	 *   try块中主要放置可能会产生异常的代码块。try块里的代码出现异常,系统生成一个异常对象提交给运行环境,此过程为抛出(throw)异常。
	 *   Java环境收到异常对象时,会寻找合适的catch块,如果找不到,java运行环境就会终止,java程序将退出。
	 */
}catch(SQLException SQLexception){
	/**  每一个catch块用于捕获并处理一个特定的异常,或者这异常类型的子类。Java7中可以将多个异常声明在一个catch中。
	 *   catch块中放置当出现相应的异常类型时,程序需要执行的代码。当try中语句可能发生多个异常的时候可以由多个catch。 
	 */
}catch(Exception exception){
    //...
}finally{
     /**  finally块通常是可选的。
      *  无论异常是否发生,异常是否匹配被处理,finally都会执行。
      *  finally中存放一定会执行的代码,异常机制保证finally代码总是会被执行。
      *  当遇到try或catch中return或throw之类可以终止当前方法的代码时,jvm会先去执行finally中的语句,finally中的语句执行完毕后才会返回来执行try/catch中的return,throw语句。
      *  如果finally中有return或throw,那么将执行这些语句,不会在执行try/catch中的return或throw语句。
      *  只有System.exit()方法让finally块不执行
      *  finally块中一般写的是关闭资源之类的代码。 
      */	  
}

throws 函数声明

如果一个方法内部的代码会抛出异常,方法没有完全处理掉,则必须在方法上使用throws关键字声明这些可能抛出的异常,否则编译不通过。它不同于try…catch…finally,throws仅是将可能出现的异常向调用者声明,而自己则不具体处理

public void foo() throws ExceptionType1 , ExceptionType2 ,ExceptionTypeN
{ 
  //foo内部可以抛出 ExceptionType1 , ExceptionType2 ,ExceptionTypeN 类的异常,或者他们的子类的异常对象。
}

throw

用于抛出一个具体的异常对象

finally

1、finally块没有处理异常的能力。处理异常的只能是catch块。

2、在同一try…catch…finally块中 ,如果try中抛出异常,且有匹配的catch块,则先执行catch块,再执行finally块。如果没有catch块匹配,则先执行finally,然后去外面的调用者中寻找合适的catch块。

3、在同一try…catch…finally块中 ,try发生异常,且匹配的catch块中处理异常时也抛出异常,那么后面的finally也会执行:首先执行finally块,然后去外围调用者中寻找合适的catch块。

猜你喜欢

转载自blog.csdn.net/weixin_42679286/article/details/87863379