博主:命运之光
专栏:Java零基础入门
学习目标
掌握异常的概念,Java中的常见异常类;
掌握Java中如何捕获和处理异常;
掌握自定义异常类及其使用;
目录
异常概述
异常体系
常见的异常
Java的异常处理机制
方式一:try – catch - finally
方式二:throws+异常类型
手动抛出异常
重写方法声明抛出异常的原则
throws和throw的区别:
自定义异常
程序员在写代码的时候即便写的尽善尽美,在系统的运行过程中依据会遇到一些问题,因为很多问题不是靠代码能够避免的。
异常是处理运行时错误的特殊类,所有异常类都是java.lang.Throwable的子类,Throwable 类是类库java.Lang 包中的一个类,它派生了两个子类:Exception和Error。
Exception分为:运行时异常(非受检异常);编译时异常(受检异常)
编译时异常:类型上都属于Exception类及其子类。编译时为了保证程序的健壮性 ,可以提前预料到的异常,从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。
运行时异常:都是RuntimeException类及其子类异常,如NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。
运行时异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,也会编译通过。
1.ArithmeticException 异常
算术运算异常,当除数为零时就会产生此类异常。
例如:int x=2/0; //此时会发生ArithmeticException异常
2.ArrayIndexOutOfBoundsException异常
访问数组元素的下标越界异常,当访问的数组元素的下标超过数组的上下界时发生此类异常。
例如: int a[]=new int[3]; //定义了数组a,下标从0到2是合法的 int x=a[3]; //下标超过上界,此时会发生ArrayIndexOutOfBoundsException异常
3.ArrayStoreException异常
数组存储异常,当数组存储空间不够或类型不匹配时会产生此类异常。
例如: int a[]=new int[5]; String b=new String[5]; String.arraryCopy(a,b); //类型不匹配会产生ArrayStoreException异常
4. NegativeArraySizeException异常
负值数组大小异常,当数组的存储单元个数为负数时会产生此类异常。例如: int a[]=new int[-5]; //数组个数大小为负数,发生NegativeArraySizeException异常。
5.IndexOutOfBoundsException异常
索引(下标)越界异常,是ArrayIndexOutOfBoundsException的父类。例如: String s=”abc123”; s.charAt(8); // 下标8越界,发生IndexOutOfBoundsException异常
6.NullPointerException异常
访问空引用(指针)异常。例如: String s=null; s.charAt(2); //s为null,发生NullPointerException异常
7. NumberFormatException异常
数值格式异常,当数据类型格式转换不匹配时会产生此类异常。
8. ClassCaseException异常
类强制转换异常,当把一个类强制转换成另一个没有任何继承关系的类时产生此类异常。
9. StringIndexOutOfBoundsException异常
字符串下标越界异常。
10. SecurityException异常
安全性异常。
在编写程序时,经常要在可能出现错误的地方加上检测的代码,如进行x/y运算时,要检测分母为0,数据为空,输入的不是数据而是字符等。
Java中针对各种运行错误定义了很多异常类,每个异常类都代表了一种运行错误。每当java程序运行过程中某段代码发生一个可识别的运行错误时,JVM都会产生一个相应的异常类的对象,对象封装了异常的有关信息。
Java提供的异常处理机制是采取抛出异常,然后捕获异常的处理形式,主要分为两个步骤:
如果一个异常回到main()方法,并且main()也不处理,则程序运行终止;
程序员通常只能处理Exception,而对Error无能为力.
语法格式:
try {
// 有可能出现异常的语句
} catch (异常类型1 对象) {
// 异常处理 ;
} catch (异常类型2 对象) {
// 异常处理 ;
} catch (异常类型3 对象) {
// 异常处理 ;
} ....
finally {
//不管是否出现异常,都执行的统一代码
}
例1:直接使用对应异常类作为参数(try – catch - finally)。
public class text1 {
public static void main(String args[]) {
System.out.println("1、除法计算开始。");
try {
System.out.println("2、除法计算:" + (10 / 0)); // 此处产生异常
// 异常产生之后的语句将不再执行,此处在try中产生异常,所以下面的输出不会执行
System.out.println("异常产生后的语句");
} catch (ArithmeticException e) { // 处理算术异常
System.out.println("******** 出现异常了 *********");
}
System.out.println("3、除法计算结束。");
}
}
说明:
例2:使用异常类对应的父类作为参数(try – catch - finally)。
public class text1 {
public static void main(String args[]) {
System.out.println("1、除法计算开始。");
try {
System.out.println("2、除法计算:" + (10 / 0)); // 此处产生异常
// 异常产生之后的语句将不再执行,此处在try中产生异常,所以下面的输出不会执行
System.out.println("异常产生后的语句");
} catch (RuntimeException e) { // 处理算术异常
System.out.println("******** 出现异常了 *********");
}
System.out.println("3、除法计算结束。");
}
}
注意:
捕获异常的有关信息:
与其它对象一样,可以访问一个异常对象的成员变量或调用它的方法。
例3:输出异常完整信息。
public class text1 {
public static void main(String args[]) {
System.out.println("1、除法计算开始。");
try {
System.out.println("2、除法计算:" + (10 / 0));// 此处产生异常
// 异常产生之后的语句将不再执行,此处在try中产生异常,所以下面的输出不会执行
System.out.println("若前面代码出现异常,此行代码不会执行!");
} catch (ArithmeticException e) { // 处理算术异常
e.printStackTrace(); // 输出异常的完整信息
} finally {
System.out.println("### 不管是否出现异常我都执行!") ;
}
System.out.println("3、除法计算结束。");
}
}
Java中允许在方法的后面使用throws关键字对外声明该方法有可能发生的异常,但此方法中不处理异常。
这样调用者在调用方法时,就明确地知道该方法可能有异常,并且必须在程序中对异常进行处理,否则编译无法通过。
throws关键字声明抛出异常的语法格式如下:
修饰符 返回值类型 方法名(参数列表) throws 异常类型列表{
………
}
例:class MyMath
声明如下方法可能会抛出一个ArithmeticExcption或IOException类型的异常,使它的调用者知道要捕获这个异常。
class MyMath {
public static int div(int x, int y) throws ArithmeticException, IOException {
// 此方法不处理异常
return x / y;
}
}
“throws + 异常类型”写在方法声明处,指明此方法执行时,可能会抛出的异常类型,一旦方法体执行时,出现异常,仍会在代码处生成一个异常的对象。此对象满足throws后的异常类型时,该对象就会被抛出。
主方法也可以使用throws抛出异常,这时主方法里可以不用强制进行异常处理,而是将异常处理交给JVM进行默认处理,此时会导致程序中断。(不建议使用)
Java异常类对象除在程序执行过程中出现异常时由系统自动生成并抛出,也可根据需要使用人工创建并抛出。
手动创建并抛出异常,通过throw关键字。
throw语句用来直接抛出一个异常,后接一个可抛出的异常类对象。
格式如下:
throw new 异常类名(【参数列表】);
或
异常类名 对象名 =new 异常类名(【参数列表】);
throw 对象名;
例如:首先要生成异常类对象,然后通过throw语句实现抛出操作(提交给Java运行环境)
IOException e = new IOException( );
throw e;
或:
throw new IOException();
说明:
创建用户定义的异常类,可通过扩充(继承)Exception类来创建自己的异常类,被扩充的异常类继承Exception类的属性和方法,具有异常类全部特性,同时也和任何其他类一样,可以有数据成员、构造方法及其他功能性的成员方法。
自定义异常类后,创建异常类对象,最后再使用throw语句抛出该异常对象,在调用点添加异常处理语句即可。
自定义异常步骤
第1步:自定义异常类。例如:
class MyException extends Exception {
……
}
第2步:定义异常对象,并抛出该对象。
方式1:
throw new MyException ( );
方式2:
MyException e = new MyException( );
throw e;