JavaSE---异常
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出错等),这种错误无法恢复或不可能捕捉,导致程序终止;
异常(Exception):程序可以处理的异常;
1.1.2 按责任分:
Error 是属于JVM的责任;
RuntimeException 是属于程序的责任;
CheckedException 是属于编译器的责任;
1.1.3 常见异常体系:
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、Throwable、Exception、RuntimeException
3.1、Throwable
The {@code Throwable} class is the superclass of all errors and exceptions in the Java language.
Throwable 是 所有Error和Exception的基类;
Only objects that are instances of this class (or one of its subclasses) are thrown by the Java Virtual Machine or can be thrown by the Java {@code throw} statement.
JVM 只能抛出 Throwable及其子类 或 throw语句;
Similarly, only this class or one of its subclasses can be the argument type in a {@code catch} clause.
只有Throwable及其子类 能够作为catch语句的参数;
For the purposes of compile-time checking of exceptions, {@code Throwable} and any subclass of {@code Throwable} that is not also a subclass of either {@link RuntimeException} or {@link Error} are regarded as checked exceptions.
为了编译时检查异常,Throwable及其子类 (除了RuntimeException或Error及其子类)被视为 checked exceptions;
3.2、Exception:
The class {@code Exception} and its subclasses are a form of {@code Throwable} that indicates conditions that a reasonable application might want to catch.
Exception和它的子类 是Throwable的一种表现形式;
The class {@code Exception} and any subclasses that are not also subclasses of {@link RuntimeException} are checked exceptions.
Exception 和 任何不是RuntimeException的子类 都是checked exceptions;
Checked exceptions need to be declared in a method or constructor's {@code throws} clause if they can be thrown by the execution of the method or constructor and propagate outside the method or constructor boundary.
如果Checked exceptions在方法或构造器执行时抛出,需要 在方法或构造器声明throws语句;
3.3、RuntimeException:
RuntimeException is the superclass of those exceptions that can be thrown during the normal operation of the Java Virtual Machine.
RuntimeException 是 在JVM运行期间能够被抛出异常的 基类;
RuntimeException and its subclasses are unchecked exceptions.
RuntimeException和它的子类都是 unchecked exceptions;
Unchecked exceptions do not need to be declared in a method or constructor's throws clause if they can be thrown by the execution of the method or constructor and propagate outside the method or constructor boundary.
如果unchecked exceptions 在方法或构造器执行时抛出,不需要 在方法或构造器声明throws语句;