异常
2019-10-15 本文已影响0人
There_7f76
异常Throwable
异常(Throwable).png概念:
Throwable
类是 Java 语言中所有错误或异常的超类。只有当对象是此类(或其子类之一)的实例时,才能通过 Java 虚拟机或者 Java 语句抛出。类似地,只有此类或其子类之一才可以是 子句中的参数类型。
特点:
Throwable是一个实体类:可以从他的构造方法和方法来以及他的子类看他的特性和属性。
Error
概述:
Error
是 的子类,用于指示合理的应用程序不应该试图捕获的严重问题。大多数这样的错误都是异常条件。虽然 错误是一个“正规”的条件,但它也是 的子类,因为大多数应用程序都不应该试图捕获它。
特点:
错误是无法处理的,必须改源码,就相当于某个机器的零件缺少或者是坏道了必须更换才能让机器正常运行。
Exception
概念:
Exception
类及其子类是 Throwable
的一种形式,它指出了合理的应用程序想要捕获的条件。
特点:
- 编译期异常:程序在编译器就报出的异常,这里需要我们先解决这个异常才能运行程序
- 运行期异常:编译器不会报的异常,而是程序在执行到某段代码时才会报出的异常。
用法:
-
throw关键字
- 在指定的方法内部抛出指定的异常
- 格式:throw new xxException("产生异常的原因");
- throw方法后面new的必须是Exception类对象或者Exception类的子类对象
- 当throw抛出这个异常的时候我们就要对其进行处理不然JVM会终止程序的运行的
- 当new的对象是RuntimeException或者RuntimeException的子类对象时我们可以不进行处理默认交给JVM处理(打印异常对象,终止程序运行)
- 当new的对象时编译器异常时,我们就要对其进行处理了。
- throws抛给调用者
- try ......catch捕获处理
public class Demo_Throw {
public static void main(String[] args) {
int [] array = null;
int [] arr=new int[3];
int index=0;
int index1=4;
// getElement(array,index);
getElement1(arr,index1);
}
private static void getElement1(int[] arr, int index1) {
if (index1<0||index1>arr.length){
throw new IndexOutOfBoundsException("index索引越界");
}
}
private static void getElement(int[] array, int index) {
if (array==null){
throw new NullPointerException("数组为空");
}else {
int value=array[index];
}
}
}
-
throws关键字
- throws:处理异常的一种方式,写在方法名后面。
- 作用:将异常交给方法的调用者处理,如果他的调用者也不处理最后将会由JVM进行处理(打印异常类,终止程序)
- 格式:修饰符 返回类型 方法名称(参数列表)throws XXXException,YYYException....{}
- 注意:当throws后面接的异常对象有多个时,必须都要写上,如果这多个对象有子父类关系时,可以只写父类
public class Demo_Throws {
public static void main(String[] args) throws IOException {
demo("C;\\a.txta");
}
private static void demo(String fileName) throws IOException {
if(!fileName.endsWith(".txt")){
throw new IOException("file type error" );
}else {
System.out.println("file read OK");
}
}
}
-
try....catch...finally捕获异常进行处理
-
异常的第二种处理方式,当throw抛出异常时,我们用它进行捕获然后处理,这样不影响程序的后续执行,即不会终止程序,这也是开发中最推荐使用的一种方式。
-
格式:
try{ 可能出现异常的代码块 }catch(异常类名 变量名){ //这里可以使用自定义的异常类,但是自定义的异常类必须继承Exception才能使用 这里对异常进行处理,一般时存入错误日志 }finally{ 强制要执行的(无论程序是否出现异常都要执行的) } //这里的finally不是一定需要的,finally一般用来释放某种资源占用,它不能单独存在,必须依托try catch存在
-
使用案例:
-
public class Demo_TryCatchFinally {
public static void main(String[] args){
try {
demo("C;\\a.txta");
}catch (IOException e){
e.printStackTrace();//打印详细异常信息
}finally {
//释放IO资源
System.out.println("成功释放资源");
}
}
private static void demo(String fileName) throws IOException {
if(!fileName.endsWith(".txt")){
throw new IOException("file type error" );
}else {
System.out.println("file read OK");
}
}
}