1、概述
1.1 异常机制已经成为一门语言是否成熟的标准,传统的 C语言没有提供异常机制;
主流的 Java、Python、C#均提供异常机制;
1.2 Java的异常机制只要由try , catch , finally , throw , throws关键字:
try:
try后紧跟一个花括号括起来的代码块,又称try块;
代码块放置可能引发异常的代码;
catch:
catch后对应异常类型和代码块;
catch块用于处理这种异常类型;
catch块可以有多个;
finally:
一个或多个catch块后紧跟finally块;
finally块用于回收在try块中打开的物理资源;
异常机制保证finally块总是被执行;
throw:
用于抛出实际的异常,可以作为单独语句使用,抛出一个具体异常对象;
throws:
主要在方法中使用;
用于声明该方法可能抛出的异常;
1.3 我们都希望所有的错误可以在编译阶段(程序运行之前)被发现,但不现实,很多问题需要在运行期间得到解决;
1.4 Java将异常分为2种:
Checked异常:
Java认为Checked异常都是可以在编译阶段被处理,所有强制程序处理所有的Checked异常,Runtime异常则无需处理;
Checked异常可以提醒程序员需要处理所有可能发生的异常;
Runtime异常:
2、异常处理机制
1.1 Java的异常处理机制可以让程序具有更好的容错性、健壮性,
1.2 如果try块中的业务代码出现异常,系统自动生成一个异常对象,该异常对象被提交给Java运行环境,此过程称为 抛异常;
1.3 当Java环境接收到异常对象时,会寻找处理该异常对象的catch块,如果找到合适的就交由catch块处理,此过程称为 捕获异常;
如果找不到捕获异常的catch块,则运行环境终止,Java程序退出;
1.4 Java提供的异常类体系:
1.1.1 Java把非正常情况分为:异常(Exception)、错误(Error),都继承自Throwable类
错误(Error):一般指JVM相关的问题(系统崩溃、JVM出错等),这种错误无法恢复或不可能捕捉,导致程序终止;
1.5 【访问异常信息】
1.1.1 如果程序需要在catch块中访问异常对象的信息,可以通过调用catch后异常形参获得;
1.1.2 当Java运行时决定调用某个catch块处理异常对象时,会将该异常对象赋值给catch块后形参;
1.6 【使用finally回收物理资源】
1.1.1 有时候,在try块中打开一些物理资源(数据库连接、网络连接等),需要被显式回收
(Java的回收机制不会回收物理资源,只会回收堆内存对象所占的内存)
1.1.2 为了保证一定回收try块中的物理资源,异常处理机制提供了finally块,不管try块中是否有异常,也不管哪个catch块被执行,finally块总被执行;
1.7 【注意】
1.1.1 异常处理结构语法中,只有try块是必须的(没有try,就没有catch,finally),catch块和finally块都是可选的;
1.1.2 catch块和finally块至少出现其中之一,也可以同时出现(不能只有try);
1.1.3 可以有多个catch块,但捕获父异常的catch 必须位于 捕获子异常的 后面;
1.1.4 catch必须位于try之后,finally必须位于catch之后;
1.1.5 案例
package com.exiuge.mytest.exception; import java.io.FileInputStream; import java.io.IOException; /** * 除非在try、catch块中调用退出JVM的方法(System.exit(1)),不然finally块总会执行 */ public class Test { public static void main(String[] args){ FileInputStream fileInputStream=null; try { fileInputStream=new FileInputStream("a.txt"); }catch (IOException ioe){ System.out.println(ioe.getMessage()); //return; System.exit(1); }finally { if (fileInputStream!=null){ try { fileInputStream.close(); }catch (IOException ioe){ ioe.printStackTrace(); } System.out.println("finally回收物理资源"); } } } }
3、Checked异常、Runtime异常
1.1 Runtime异常:
1.1.1 所有RuntimeException类及其子类均为Runtime异常;
1.1.2 Runtime异常无须显式抛出,如程序需要捕获Runtime异常,也可以使用try...catch
1.2 Checked异常:
1.1.1 不属于RuntimeException类及其子类的为Checked异常;
1.1.2 只有Java语言提供了Checked异常,其他语言都没有;
1.1.3 Java任务Checked异常都是可以被处理的异常,必须显式处理,如果程序没有处理Checked异常,编译期间就会发生错误,无法通过编译;
1.1.4 Checked异常的处理方式:
当前方法如果明确知道如何处理该异常,则应该try...catch进行处理;
当前方法如果不知道如何处理该异常,在定义方法时声明抛出异常;
原文:https://www.cnblogs.com/anpeiyong/p/10447679.html