Java异常
异常分为Checked和Unchecked,除了Error与RuntimeException是Unchecked(提醒不强烈,程序运行时才报错,适合不容易出错的地方,在自定义异常时需继承RuntimeException类)以外,其他剩下的异常都是Checked Exception(提醒强烈,编译阶段报错,适合容易出错的地方,在自定义异常时需继承Exception类)。
Checked Exception需要用try...catch...捕获或者用throws抛出,Unchecked Exception则可以不做处理
异常处理
public class Demo01 {
public static void main(String[] args) {
// 假设要捕获多个异常,从小到大捕获
try { // try监控区域
System.out.println(1 / 0);
} catch (ArithmeticException e) { //可以有多个catch
e.printStackTrace(); // 打印错误的栈信息
}catch (IndexOutOfBoundsException e){
// 在java中所有捕获范围小的异常,必须放在捕获大的异常之前。否则程序在编译的时候就会出现错误提示
System.out.println("Array");
}finally { //可选
System.out.println("finally");
cal(0);
}
// 快捷键Ctrl + Alt + T
// 处理div()方法抛出的异常
try {
System.out.println(div(1,0));
} catch (ArithmeticException e) {
e.printStackTrace();
}
}
public static void cal(int a) {
if (a == 0) {
// throw 则是指拋出的一个具体的异常类型,执行 throw 则一定抛出了某种异常对象。
throw new RuntimeException("a为0"); //不需要进一步处理(try...catch或用throws抛出)
}
}
// throws 用来声明一个方法可能抛出的所有异常信息,表示出现异常的一种可能性,但并不一定会发生这些异常;
public static int div(int a, int b) throws ArithmeticException {
return a / b;
}
public static void testException(int a) {
if(a < 0){
try {
throw new Exception(); // 需要进一步处理
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
自定义异常
(1)定义一个新的异常类,这个类必须是Throwable类或Exception类的子类。定义格式如下:
class 自定义异常类名 extends Exception{
异常类体;
}
(2)自定义的异常类,一般只要声明两个构造方法,一个是不用参数的,另一个以字符串为参数。
例如,定义一个MyException的异常类如下:
class MyException extrends Exception {
public MyException(){}
public MyException(String msg){
super(msg);
}
}
Exception类从父类Throwable那里继承了很多方法,其中最常用的有以下三种:
String getMessage() 获得异常对象的描述信息
String toString() 返回描述当前Exception类信息的字符串
void printStackTrace() 向标准输出设备打印出当前异常对象的调用堆栈路径