今天我们继续来学习JavaSE相关的知识,希望与大家共同努力。
目录
异常
什么是异常
运行时异常
编译时异常
编辑
为什么需要异常处理机制
错误
异常的处理与抛出
异常处理
异常抛出
自定义异常
结语
异常
什么是异常
Java中异常是一种在程序运行时发生的特殊情况,它打断了正常的指令流程。当Java虚拟机JVM检测到这种情况时,它会抛出一个异常对象。我们之前接触的一些异常比如数组越界异常,空指针异常,算术异常等都是异常类型,我们的每一个异常也是一个类,他们都继承自Exception类。
异常主要有以下两类:运行时异常和编译时异常。
运行时异常
异常的第一种类型是运行时异常,在编译阶段无法预判代码是否会出现问题,只有在运行的时候才知道会不会出错,这样的异常称为运行时异常。所有的运行时异常都继承自RuntimeException。比如下面这个例子就是一个运行时异常:
public class Main {
public static void main(String[] args) {
test(1, 0);
}
private static int test(int a, int b){
return a/b; //没有任何的判断而是直接做计算
}
}
编译时异常
编译时异常是明确会出现的异常,在编译阶段就需要进行处理的异常,如果不进行处理,将会编译失败。默认继承自Exception类的异常都是编译时异常。比如这段代码,我们直接使用未声明的变量就会报错,这就是编译时异常。
public class Main {
public static void main(String[] args) {
System.out.println(a+b);
}
}
为什么需要异常处理机制
Java的异常机制是Java编程语言中一个重要的特性,它提供了一种结构化的方式来处理程序运行时可能出现的错误情况。我们需要异常处理机制的原因如下:
- 错误处理:异常机制允许程序员在可能发生错误的地方通过抛出异常的方式来标识这些错误,然后在程序的其它部分(通常是更高层次的代码)捕获并处理这些异常,从而避免了程序的突然崩溃。
- 代码清晰
- 增强程序的健壮性
错误
在Java中错误是程序运行过程中发生的严重问题,这些问题通常是由系统资源不足、虚拟机故障等底层问题引起的,它们超出了程序本身能够处理的范围。错误是无法通过代码来捕获或处理的,一旦发生错误,程序往往无法继续执行,而是会被终止。
常见的错误类型有内存溢出错误OutOfMemoryError、栈溢出错误StackOverflowError等,比如:
import java.util.ArrayList;
import java.util.List;
public class OutOfMemoryErrorExample {
public static void main(String[] args) {
List<Object> list = new ArrayList<>();
while (true) {
list.add(new Object());
}
}
}
或者我们用一个更加常见的例子:
public class Main {
public static void main(String[] args) {
int[] arr = new int[Integer.MAX_VALUE];
}
}
异常的处理与抛出
异常处理
当程序没有按照我们想要的样子运行而出现异常时,我们希望能够自己处理出现的问题,让程序继续运行下去,就需要对异常进行捕获,此时我们可以使用try+catch的组合语句来解决问题,具体格式如下:
public class Main {
public static void main(String[] args) {
int[] arr = new int[5];
try{ //在try块中运行代码,当代码出现异常时,异常会被捕获,并在catch块中得到异常类型的对象
arr[10] = 1;
}catch (ArrayIndexOutOfBoundsException e){ //捕获的异常类型
System.out.println("程序有异常,请检查"); //出现异常时执行
}
//后面的代码会正常运行
System.out.println("点赞+关注,可以吗,求求你了🥺");
}
}
PS:运行时异常在编译时可以不用捕获,但是编译时异常必须进行处理
异常抛出
当别人调用我们的方法时,如果传入了错误的参数导致程序无法正常运行,这时我们就需要手动抛出一个异常来终止程序继续运行下去,同时告知上一级方法执行出现了问题。
public class Main {
public static void main(String[] args) {
try {
test(1, 0);
} catch (Exception e) { //捕获方法中会出现的异常
e.printStackTrace();
}
}
private static int test(int a, int b) throws Exception { //声明抛出的异常类型
if(b == 0) throw new Exception("0不能做除数"); //创建异常对象并抛出异常
return a/b; //抛出异常会终止代码运行
}
}
通过throw关键字抛出异常当程序运行到这一行时,就会终止执行,并出现一个异常。如果想要调用声明编译时异常的方法,但是依然不想去处理,可以同样的在方法上声明throws来继续交给上一级处理。当main方法都声明抛出异常时,出现异常就由JVM进行处理,也就是默认的处理方式。
自定义异常
在Java中,自定义异常是开发者根据特定业务逻辑或应用场景的需要,继承自Java异常体系中的某个类,创建的新的异常类。自定义异常允许开发者更精确地表达程序中可能发生的错误情况。在定义了自定义异常之后,你可以在你的业务逻辑中抛出这个异常,并在需要的地方捕获并处理它。
创建自定义异常我们通常需要以下步骤:
- 确定继承的基类
- 定义构造方法
- 添加额外的构造方法或方法
结语
以上就是对异常、错误和异常抛出处理的介绍与学习。希望能对大家有帮助,如果您觉得有帮助也希望您能留下点赞收藏与关注,这对我很重要,谢谢!