简单示例
下面是一个简单的示例,说明了Java中异常处理的过程:
`java
public class ExceptionExample {
public static void main(String[] args) {
try {
int result = divide(10, 0);
System.out.println("结果:" + result);
} catch (ArithmeticException e) {
System.out.println("除数不能为0!");
}
System.out.println("程序继续执行...");
}
public static int divide(int dividend, int divisor) {
return dividend / divisor;
}
`
在上面的示例中,我们定义了一个divide方法,用于进行两个数的除法运算。当除数为0时,会抛出一个ArithmeticException异常。在main方法中,我们使用try-catch语句块来捕获这个异常,并在catch块中打印出错误信息。
当程序执行到divide方法时,由于除数为0,会抛出一个ArithmeticException异常。程序会立即停止当前的执行流程,并跳转到catch块中执行异常处理代码。在catch块中,我们打印出了错误信息"除数不能为0!"。
在异常处理完成后,程序会继续执行catch块之后的代码,即打印"程序继续执行..."。这表明,即使抛出了异常,Java程序仍然可以继续执行,而不会终止。
需要注意的是,如果在try块中抛出异常后没有相应的catch块来处理异常,那么异常将会被抛到调用栈的上一级,直到找到合适的catch块来处理异常,或者程序终止。
异常及其体系介绍
基本概念
Java语言中,将程序执行中发生的不正常情况称为“异常”。(开发过程中的语法错误和逻辑错误不是异常)
执行过程中所发生的异常事件可分为两大类
1)Error(错误):Java虚拟机无法解决的严重问题。如: JVM系统内部错误.资耗尽等严重情况。比如: StackOverflowError[栈溢出]和O0M(out ofmemory)内存溢出,Error 是严重错误,程序会崩溃
2)Exception: 其它因编程错误或偶然的外在因素导致的一般性问题,可以使用网络连接对性的代码进行处理。例如空指针访问,试图读取不存在的文件,断等等,Exception 分为两大类: 运行时异常[和编译时异常[。
在程序遇到异常时,程序会无法执行,所以引入了异常处理机制,使得程序继续执行,保证了程序的健壮性。
常见的运行时异常包括
1)NullPointerException空指针异常
2)ArithmeticException数学运算异常
3)ArraylndexOutOfBoundsException数组下标越界异常
4)ClassCastException类型转换异常
5)NumberFormatException数字格式不正确异常
常见的编译异常
编译异常是指在编译期间,就必须处理的异常,否则代码不能通过编译
常见的编译异常
SQLException //操作数据库时,查询表可能发生异常
IOException //操作文件时,发生的异常
FileNotFoundException //当操作一个不存在的文件时,发生异常
ClassNotFoundException //加载类,而该类不存在时,异常
EOFException // 操作文件,到文件未尾,发生异常
lllegalArguementException //参数异常
异常处理机制
1、try catch finally
2、throws
异常处理机制细节
一、 try catch finally
try-catch方式处理异常-注意事项
1)如果异常发生了,则异常发生后面的代码不会执行,直接进入到catch块
2)如果异常没有发生,则顺序执行try的代码块,不会进入到catch.
3)如果希望不管是否发生异常都执行某段代码(比如关闭连接,释放资源等)则使用如下代码- finally{}
tryl {
//可疑代码
}
]catch(异常)
{....}
finally{
//释放资源等
}
try {int a = Integer.parselnt(str):System.out.println("数字:"+ a);}catch (Exception e) {e.printStackTrace();} finally {System.out.println("不管是否发生异常,始终执行的代码~~”;}
4)可以有多个catch语句,捕获不同的异常(进行不同的业务处理),要求父类异常在后,子类异常在前,比如(Exception 在后,NullPointerException 在前),如果发生异常,只会匹配一个catch,案例演示
try{
} catch(NullPointerExcetpion e) {}
catch(Exception e){}
finally{}
5)可以进行 try-finally配合使用,这种用法相当于没有捕获异常直接崩掉,因此程序会直接崩掉。应用场景就是执行一段代码,不管是否发生异常,都必须执行某个业务逻辑
try {
//代码...
}
finally{ //总是执行
}
二、throws
注意事项和使用细节
1)对于编译异常,程序中必须处理,比如try-catch 或者throws
2)对于运行时异常,程序中如果没有处理,默认就是throws的方式处理[举例]
3)子类重写父类的方法时,对抛出异常的规定:子类重写的方法,所抛出的异常类型要么和父类抛出的异常一致,要么为父类抛出的异常的类型的子类型[举例]
4)在throws 过程中,如果有方法try-catch,就相当于处理异常,就可以不必throws
throw 与 throws 的区别
意义 | 位置 | 后面跟的东西 | |
throws | 异常处理的一种方式 | 方法声明处 | 异常类型 |
throw | 手动生成异常对象的关键字 | 方法体中 | 异常对象 |
使用格式: throw new xxxException(“异常产生的原因”)
/*
定义一个方法,获取数组指定索引处的元素
参数:
int[] arr
int index
以后(在工作中)我们首先必须对方法传递过来的参数进行合法性校验
如果参数不合法,那么我们就必须使用抛出异常的方式,告知方法的调用者,传递的参数有问题。
注意:
NullPointerException是一个运行期异常,我们不用处理,默认交给JVM处理
ArrayIndexOutOfBoundsException是一个运行期异常,我们不用处理,默认交给JVM处理
*/
public static int getElement(int[] arr, int index) {
/*
我们可以对传递过来的参数数组,进行合法性校验
如果数组arr的值是null
那么我们就抛出空指针异常,告知方法的调用者“传递的数组的值是null”
*/
if(arr == null) {
throw new NullPointerException("传递的数组的值是空!");
}
/*
我们可以对传递过来的参数index进行合法性校验
如果index的范围不在数组的索引范围内
那么我们就抛出数组索引越界异常,告知方法的调用者“传递的索引超出了数组的适用范围”
*/
if(index < 0 || index > arr.length-1) {
throw new ArrayIndexOutOfBoundsException("传递的索引超出了数组的使用范围");
}
int ele = arr[index];
return ele;
}
————————————————
版权声明:本文为CSDN博主「黄叶都」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_44764207/article/details/106862531
自定义异常
●基本概念
当程序中出现了某些“错误”,但该错误信息并没有在Throwable子类中描述处理,这个时候可以自己设计异常类,用于描述该错误信息。
自定义异常的步骤·
1)定义类:自定义异常类名(程序员自己写)继承Exception或RuntimeException
2)如果继承Exception,属于编译异常
3)如果继承RuntimeException,属于运行异常(一般来说,继承RuntimeException,因为Exception还需要在调用的位置处声明一个抛出异常)
简单示例
public class Exception_ {
public static void main(String[] args) {
int age = 130;
if (0<age&&age>100) {
throw new AgeException("您的年龄输入不正确");
}
System.out.println("您的年龄输入正确");
}
}
class AgeException extends RuntimeException {
public AgeException (String message) { //构造器 , 消息参数message
super(message); //调用父类构造器,最终调用了Throwable的构造器
}
}