非常详细的Java异常处理机制知识整理大全
异常定义
异常(Exception):程序在执行过程中出现的错误。
异常分类
Java中的异常分为三类,分别是检查性异常(Checked Exception)、运行时异常(Runtime Exception)和错误(Error)。
检查性异常(Checked Exception)
检查性异常指在编译期间能够被检查出来的异常,如Java中的IOException和SQLException等。
运行时异常(Runtime Exception)
运行时异常指程序在执行过程中出现的异常,如NullPointerException和ArrayIndexOutOfBoundsException等。
错误(Error)
错误指程序在执行过程中出现的错误,如OutOfMemoryError和StackOverflowError等。
异常处理机制
异常处理机制分为抛出与捕获两个部分。
抛出异常
在Java中,使用throw关键字抛出一个异常,他的语法结构为:
throw throwableInstance;
其中throwableInstance是一个Throwable类型的实例,可以是一个已有的异常对象或者是一个我们自己创建的异常对象。
下面是一个使用throw关键字手动抛出异常的示例:
public class ThrowExceptionExample {
public static void main(String[] args) {
int number = 20;
if (number < 50) {
throw new RuntimeException("Number is too small.");
}
}
}
这个示例中,我们手动抛出了一个RuntimeException异常,并且为该异常提供了一个自定义的消息。
在上面的示例中,代码执行到if语句会首先判断number是否小于50,如果小于50,那么抛出一个RuntimeException异常。
捕获异常
在Java中,使用try-catch语句捕获异常。
try-catch语句的语法结构如下:
try {
// 可能会出现异常的代码
} catch (ExceptionType e) {
// 异常处理代码
}
在try语句块中编写可能会出现异常的代码,在catch语句块中编写异常处理代码。如果try语句块中的代码抛出异常,那么程序将跳转到最近的catch语句块中执行异常处理的代码。
下面是一个使用try-catch语句捕获异常的示例:
public class CatchExceptionExample {
public static void main(String[] args) {
try {
int number1 = Integer.parseInt(args[0]);
int number2 = Integer.parseInt(args[1]);
int result = number1 / number2;
System.out.println(result);
} catch (ArithmeticException e) {
System.out.println("除数不能为0");
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("请提供数字");
} catch (NumberFormatException e) {
System.out.println("数字格式不正确");
}
}
}
这个示例中,我们尝试解析命令行参数并进行除法运算,而在这个过程中可能抛出多个类型的异常。
因此,我们使用了多个catch语句块来捕获不同类型的异常,并针对不同类型的异常编写不同的异常处理代码。如果出现了多个异常类型,那么程序将按照捕获处理的顺序执行对应的catch实例。
finally代码块
finally代码块是可选的,在try-catch语句块中使用,无论是否抛出异常都会执行里面的代码。finally代码块通常用来释放资源、关闭文件等操作。
下面是一个使用try-catch-finally语句块关闭文件的示例:
public class CloseFileExample {
public static void main(String[] args) {
BufferedReader br = null;
try {
br = new BufferedReader(
new FileReader("file.txt")
);
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (FileNotFoundException e) {
System.out.println("文件不存在");
} catch (IOException e) {
System.out.println("读取文件出错");
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
System.out.println("关闭文件出错");
}
}
}
}
}
在上面的示例中,我们尝试读取一个名为file.txt的文件,如果读取出错或者文件不存在,我们打印出对应的错误消息。并且在finally代码块中关闭文件。
自定义异常
除了Java SDK中提供的异常类外,我们还可以自己定义异常。在创建自定义异常类时,通常要继承Exception或RuntimeException类。
下面是一个自定义异常的示例:
public class UserNotFoundException extends RuntimeException {
public UserNotFoundException(String message) {
super(message);
}
}
这个示例中,我们自定义了一个UserNotFoundException异常类,继承了RuntimeException类,用户在查询用户时,如果用户不存在,就可以抛出这个异常。
关于try-with-resources
在Java 7中引入了try-with-resources来解决资源管理的问题。
当使用try-with-resources时,可以将需要关闭的资源作为try语句的一部分进行声明,Java会自动关闭这个资源。
下面是一个使用try-with-resources关闭文件的示例:
public class TryWithResourcesExample {
public static void main(String[] args) {
try (BufferedReader br = new BufferedReader(
new FileReader("file.txt"));
BufferedWriter bw = new BufferedWriter(
new FileWriter("new-file.txt"))) {
String line;
while ((line = br.readLine()) != null) {
bw.write(line);
bw.newLine();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
在上面的示例中,我们使用try-with-resources同时声明了需要关闭的BufferedReader和BufferedWriter,当try语句块结束时,Java会自动关闭这两个资源。
通过使用try-with-resources,我们可以通过更紧凑的语法结构来管理资源,而无需显式地编写finally代码块。
总结
异常处理是Java程序设计中非常重要的一部分,当程序出现异常时,合理地处理异常可以提高程序的健壮性和可维护性。这篇文章介绍了异常的基本概念以及异常处理的流程,涵盖了Java中所有类型的异常的处理方式,并提供了多个示例以便读者更好地理解异常处理的相关知识。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:非常详细的Java异常处理机制知识整理大全 - Python技术站