异常
异常的概念
- 异常指的是程序运行时发生的不正常事件;异常能够被程序处理,保证程序继续运行下去
public class Demo {
public static void main(String[] args) {
int a = 10;
int b = 0;
//明知10/0 除不尽 非要运算导致算数异常
//java.lang.ArithmeticException
System.out.println(a/b);
}
}- 开车--->撞车--->报警--->继续开车(由开车到撞车到报警解决问题)
- 程序--->运行--->异常--->处理异常(程序运行出现异常、能够被处理还可以继续运行)
- 开车--->撞车--->不报警--->协商无果--->打架(撞车处理不当导致事情无法解决)
- 程序--->运行--->错误--->程序终止--->修改代码(程序运行出现错误、异常无法处理导致程序崩溃)
异常结构图

- 图中所示:Throwable是Java中所有错误(Error)和异常(Exception)的父类。在Java中,所有的异常和错误都必须继承自Throwable类。
- Error(错误):JVM内部错误或系统错误,这类错误一般由JVM或操作系统引起,而程序本身一般无法处理和恢复。
- Exception: 程序运行过程中可能会出现的异常情况,包括可检查异常(Checked Exception)和不可检查异常(Unchecked Exception)两种类型。
- RuntimeException:子类都是运行时异常 其他都为编译时异常
异常的语法
public class Demo {
public static void main(String[] args) {
try{
//产生异常的代码段
}catch (异常类型 1){
//异常类型代码块
}finally {
//最后执行的语句块
}
}
}- try-catch-finally 块中使用 return 语句时,finally 块中的代码会在返回结果之前执行,但是通常情况下,return 语句仍然是最后执行的语句
- 有一个特殊情况 finally 块可能不会被执行。那就是在程序运行的时候遇到了 System.exit() 方法调用。
- System.exit() 方法并不仅仅只在 finally 块中会导致程序退出。在任何地方调用这个方法都会使程序立即退出,包括在 main() 方法中调用 System.exit() 也会导致 JVM 关闭
public class Demo {
public static void main(String[] args) {
//show(10,0); //单独执行只是说抛出了异常没有处理
try {
show(10,0);
} catch (Exception e) {
e.printStackTrace(); //打印异常错误信息
}
}
public static void show(int a,int b){
if (b == 0) {
//主动抛出异常 一般在方法内部使用但是并没有处理
throw new ArithmeticException("出现算数异常");
}
}
}public class Demo {
public static void main(String[] args) {
SimpleDateFormat sdf = new SimpleDateFormat();
Date date = new Date();
String str = sdf.format(date);
System.out.println(str); //23-3-6 下午11:13
String s = "23-3-6 下午11:12";
//当出现异常直接对异常进行捕捉处理
try {
Date parse = sdf.parse(s);
} catch (ParseException e) {
e.printStackTrace();
}
System.out.println("s = " + s); //s = 23-3-6 下午11:12
}
}自定义异常
定义异常类--->继承Throwable类、继承Exception类或者RuntimeException类--->编写构造方法继承父类的实现--->实例化自定义对象--->使用throw抛出
public class MyException extends Exception{
private int a;
public MyException(int a) {
this.a = a;
}
//打印异常信息
@Override
public String toString() {
return "MyException{" +
"a=" + a +
'}';
}
}public class Demo2 {
public static void main(String[] args) {
try {
show(11);
} catch (MyException e) {
throw new RuntimeException("MyException----->" + e);
//Exception in thread "main" java.lang.RuntimeException: MyException----->MyException{a=11}
// at Demo6.Demo2.main(Demo2.java:8)
}
}
public static void show(int a) throws MyException {
if (a > 10){
throw new MyException(a);
}
System.out.println(a);
}
}