Java学习之走进异常
程序员文章站
2022-06-23 10:49:22
...
异常概念
- 程序在运行的过程中出现的不正常现象。出现异常不处理将终止程序运行
- 异常处理的必要性:任何程序都可能存在大量的未知问题,错误;如果不对这些问题进行正确处理,则可能导致程序的中断,造成不必要的损失
- 异常处理:Java编程语言使用异常处理机制为程序提供了异常处理的能力
异常分类
- Throwable:可抛出,一切错误或异常的父类,位于java.lang包中
- Error:JVM,硬件,执行逻辑错误,不能手动处理
*Error
OutOfMemoryError - Exception:程序在运行和配置中产生的问题,可处理
RuntimeException:运行时异常,可处理,可不处理
CheckedExcetion:检查时异常,必须处理
- Error:JVM,硬件,执行逻辑错误,不能手动处理
1.常见运行时异常
异常的产生
- 当程序在在运行时遇到不符合规范的代码或结果时,会产生异常或程序员使用throw关键字手动抛出异常
异常的传递
- 异常的传递:按照方法的调用链反向传递,如始终没有处理异常,最终会由jvm进行默认异常处理(打印堆栈跟踪信息)
异常的处理
-
Java的异常处理是通过5个关键字实现的
- try:执行可能产生异常的代码
- catch:捕获异常,并处理
- finally:无论是否发生异常,代码总能执行
- throw:手动抛出异常
- throws:声明方法可能要抛出的各种异常
-
try…catch
1.正常运行
2.发生异常并捕获
3.发生异常,不能捕获
/**
* try...catch
*/
public class Demo02 {
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("结果是:"+result);
System.out.println("程序结束");
}
}
try…catch…finally
1.finally块是否发生异常都执行,可以释放资源
2.fianlly块不执行的唯一情况,退出java虚拟机
/**
* try...catch...finally
*/
public class Demo03 {
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();
}finally {
System.out.println("释放资源");
}
System.out.println("结果是:"+result);
System.out.println("程序结束");
}
}
- try…catch…catch…catch多重catch
1.子类在异常前,父类异常在后
2.发生异常时按顺序逐个匹配
3.只执行第一个与异常类型匹配的catch语句
4.finally根据需要可写可不写 - try…finally
- try…finally不能捕获异常,仅仅用来当发生异常时,用来释放资源
- 一般用在底层代码,只释放资源不做异常处理,把异常向上抛出
/**
* try...finally
*/
public class Demo04 {
public static void main(String[] args) {
try {
divide();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void divide(){
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;
}finally {
System.out.println("释放资源");
}
System.out.println("结果是:"+result);
System.out.println("程序结束");
}
}
1.声明异常
- 如果在一个方法体中抛出了异常,用throws关键字声明异常
- 使用原则:底层代码向上声明或者抛出异常,最上层一定要处理异常,否则程序中断
/**
* 声明异常
* throws
*/
public class Demo05 {
public static void main(String[] args) {
try {
divide();
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
public static void divide() throws Exception{
Scanner scanner = new Scanner(System.in);
int result=0;
System.out.println("请输入第一个数字");
int num1=scanner.nextInt();
System.out.println("请输入第二个数字");
int num2=scanner.nextInt();
result=num1/num2;
System.out.println("释放资源");
System.out.println("结果是:"+result);
System.out.println("程序结束");
}
}
2.抛出异常
- 除了系统自动抛出异常外,有些问题需要程序员自行抛出异常
- throw关键字:抛出异常
- 语法:throw new 异常对象
- 如果抛出的是检查异常,需要在方法体声明异常
if(n>1){
n++;
}else{
throw new RuntimeException("n小于1");
}
自定义异常
- 需继承自Exception或Exception的子类,常用RuntimeException
- 必要提供的构造方法
- 无参数构造方法
- String message参数的构造方法
/**
* 自定义异常
*
*/
public class AgeException extends RuntimeException{
public AgeException() {
}
public AgeException(String message) {
super(message);
}
public AgeException(String message, Throwable cause) {
super(message, cause);
}
public AgeException(Throwable cause) {
super(cause);
}
public AgeException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}
方法覆盖(重写)
- 带有异常声明的方法覆盖:
- 方法名,参数列表,返回值类型必须和父类相同
- 子类的访问修饰符合父类相同或是比父类更宽
- 子类的方法,不能抛出比父类更多,更宽的检查异常
上一篇: Java学习之异常机制
下一篇: 1、jdk环境变量配置