异常分类及常见异常
下面介绍常见的异常类,它们都是RuntimeException的子类。
⑴ 算术异常ArithmeticException
⑵ 空指针异常NullPointerException
⑶ 类型强制转换异常ClassCastException
⑷数组负下标异常NegativeArraySizeException
⑸数组下标越界异常ArrayIndexOutOfBoundsException
捕获异常
1.抛出异常
当程序发生异常时,产生一个异常事件,生成一个异常对象,并把它提交给运行系统,再由运行系统寻找相应的代码来处理异常。这个过程称为抛出(throw)一个异常。一个异常对象可以由Java虚拟机生成,也可以由运行的方法生成。异常对象中包含了异常事件类型、程序运行状态等必要的信息。
2.捕获异常
异常抛出后,运行时系统从生成对象的代码开始,沿方法的调用栈逐层回溯查找,直到包含相应处理的方法,并把异常对象交给该方法为止,这个过程称为捕获(catch)一个异常。
3.程序对错误与异常的三种处理方式:
(1)程序不能处理的错误 Error类为错误类,如内存溢出、栈溢出等。这类错误一般由系统进行处理,程序本身无需捕获和处理。例如,运行没有main方法的类将产生NoClassDefFoundError错误
(2)程序应避免而不捕获的异常 对于运行时异常类(RuntimeException),如数组越界等,在程序设计正常时不会发生,在编程时使用数组长度a.length来控制数组的上界即可避免异常发生,而无须使用try-catch-finally语句。
由方法抛出异常交系统处理
对于程序中需要处理的异常,一般编写try-catch-finally语句捕获并处理;
而对于程序中无法处理必须由系统处理的异常,可以使用throw语句在方法中抛出异常交系统处理。
例如,对于文件流操作,将必须捕获的系统定义的异常交由系统系统处理。
样例:
有关数组的异常
package com.kk.test04;
import java.util.InputMismatchException;
import java.util.Scanner;
public class Test7_1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] numbers = new int[5];
try {
for (int i = 0; i < numbers.length; i++) {
System.out.println("请输入");
numbers[i] = sc.nextInt();
}
} catch (InputMismatchException e) {
System.out.println("请输入整数");
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("请输入最多5个整数");
}
}
}
样例二:是否可以组成三角形
package com.kk.test04;
import java.util.Scanner;
public class Test7_2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
try {
triangle(10, 2, 1);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
public static void triangle(int a, int b, int c) throws Exception {
if (a + b > c && a + c > b && b + c > a) {
System.out.println("可以组成三角形");
} else {
throw new Exception("不能组成三角形");
}
}
}
样例三:判断除数是否为0
package com.kk.test04;
import java.util.Scanner;
public class Test7_3 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
try {
int c = a / b;
} catch (NumberFormatException e) {
e.printStackTrace();
} catch (ArrayIndexOutOfBoundsException e) {
e.printStackTrace();
} catch (ArithmeticException e) {
e.printStackTrace();
}
}
}
class NegativeInputException extends Exception {
private static final long serialVersionUID = 1L;
public NegativeInputException(String str) {
super(str);
}
}