异常处理是在程序执行过程中遇到异常情况时,通过捕获和处理异常来保证程序的正常执行或进行相应的错误处理。
在 Java 中,异常处理主要通过 try-catch 块和 finally 块来实现。
异常(Exception)不是错误,而是程序中代码不够健壮或逻辑不满足要求,不处理将会中断程序不在继续执行程序 的一种手段
异常一般是可以解决的
Throwable:可抛出的,一切错误或异常的父类,
Error: JVM、硬件、执行逻辑错误,不能手动处理。往往改代码不能解决
Exception:程序在运行和配置中产生的问题,可处理。
RuntimeException:运行时异常(不检查异常),可处理,可不处理。(RuntimeException及其子类)
CheckedException:检查时异常(受检异常、编译时异常),必须处理。(Exception及其子类除了RuntimeException)
常见运行异常
异常堆栈信息
就是程序运行后,发生异常后,在控制台打出来的信息。
空指针异常
数组越界异常
类型转换异常
数字格式化异常
算术异常
package com.System;
/**
* @author cqh
* @date 2024/1/6
* @Description
*/
public class MyTest {
public static void main(String[] args) {
//空指针异常
// Student s=null;
// System.out.println("s.getName() = " + s.getName());
//数组越界异常
// int[] array= {1,2,3};
// System.out.println("array[3] = " + array[3]);
//类型转换异常
// Object name="张山";
// Integer integer=(Integer)name;
//数字格式化异常
// int i=Integer.parseInt("100a");
//算术异常
// int a=10/0;
// System.out.println("a = " + a);
}
}
检查式异常
按照方法的调用链反向传递,如始终没有处理异常,最终会由JVM进行默认异常处理(打印堆栈跟踪信息)并且终端程序运行。
package com.System;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Scanner;
/**
* @author cqh
* @date 2024/1/6
* @Description
*/
public class MyTest {
public static void main(String[] args) {
operation();
}
public static void operation(){
System.out.println("----operation----");
divide();
}
public static void divide(){
Scanner scanner = new Scanner(System.in);
System.out.println(" 输入第一个数");
Integer a=scanner.nextInt();
System.out.println("输入第二个数");
Integer b= scanner.nextInt();
Integer c=a/b;
System.out.println("c = " + c);
System.out.println("程序执行完毕");
}
}
try:执行可能产生异常的代码
catch:捕获异常,并处理
finally:无论是否发生异常,代码总能执行(Io流、JDBc的连接、网络编程资源等它们的释放资源操作都写在finally中。)
throw:手动抛出异常
throws:声明方法可能要抛出的各种异常
try catch
三种情况
1、没有异常程序正常执行
2、出现异常被捕获
3、出现异常未被捕获
package com.System;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Scanner;
/**
* @author cqh
* @date 2024/1/6
* @Description
*/
public class MyTest {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int result=0;
try {
System.out.println(" 输入第一个数");
int num1=scanner.nextInt();
System.out.println("输入第二个数");
int num2= scanner.nextInt();
result=num1/num2;
}catch (Exception e){//捕获异常
//打印异常信息
e.printStackTrace();
//System.out.println("e.getMessage() = " + e.getMessage());
// 手动退出jvm
System.exit(0);
}finally {
System.out.println("资源释放了。。。。。");
}
}
(1)子类异常在前,父类异常在后
(2)发生异常时按顺序逐个匹配
(3)只执行第一个与异常类型匹配的catch语句
(4) finally根据需要可写或不写
Scanner scanner = new Scanner(System.in);
int result=0;
try {
System.out.println(" 输入第一个数");
int num1=scanner.nextInt();
System.out.println("输入第二个数");
int num2= scanner.nextInt();
result=num1/num2;
}catch (ArithmeticException e){
System.out.println("算术异常");
}catch (InputMismatchException e){
System.out.println("输入不匹配异常");
}catch (Exception e){//捕获异常
System.out.println("未知异常");
//打印异常信息
// e.printStackTrace();
//System.out.println("e.getMessage() = " + e.getMessage());
// 手动退出jvm
// System.exit(0);
}finally {
System.out.println("资源释放了。。。。。");
}
System.out.println("result = " + result);
System.out.println("程序执行完毕");
try. . . finally不能捕获异常,仅仅用来当发生异常时,用来释放资源。
一般用在底层代码,只释放资源不做异常处理,把异常向上抛出。
throws关键字:声明异常
使用原则:底层代码向上声明或者抛出异常,最上层一定要处理异常,否则程序中断。
用Exception
需继承自Exception或Exception的子类,常用RuntimeException.
必要提供的构造方法:。无参数构造方法
.String message参数的构造方法
带有异常声明的方法覆盖:
方法名、参数列表、返回值类型必须和父类相同。
子类的访问修饰符合父类相同或是比父类更宽。
子类中的方法,不能抛出比父类更多、更宽的检查时异常。(比如:父类抛出FileNotFoundExcepyion 子类抛出Exception就会报错)
(RanTimeException不受限制)