1、Java异常(Exceptions)语法知识点及案例代码
在Java编程中,异常处理是一项重要的技能。异常是指在程序运行时发生的错误情况,这些错误情况会中断程序的正常执行。Java通过异常处理机制,允许开发者捕获和处理这些异常,使程序更加健壮和可靠。
2、异常处理基础
-
异常的概念
- 异常(Exception)指的是程序在执行过程中,出现的非正常情况,最终导致JVM的非正常停止。
- 异常本身是一个类,产生异常就是创建异常对象并抛出一个异常对象。
-
异常体系
- Java的异常体系基于
java.lang.Throwable
类,它有两个子类:java.lang.Error
和java.lang.Exception
。 Error
表示严重错误,是系统级别的错误,通常无法恢复。Exception
表示异常,是程序可以处理的错误,可以通过捕获异常来恢复程序的执行。
- Java的异常体系基于
-
异常分类
- 编译时异常(Checked Exception):在编译时期检查,如果没有处理异常,则编译失败。
- 运行时异常(Runtime Exception):在运行时检查,编译时期不会检测。
-
异常处理的关键字
try
:包含要监视的程序语句,如果发生异常,则抛出异常。catch
:捕获异常并以合理的方式处理。throw
:手动抛出一个异常对象。throws
:声明一个方法可能会抛出的异常,让调用者处理。finally
:无论是否发生异常,finally块中的代码都会执行,用于清理资源。
示例代码
- 捕获和处理异常
public class Main {public static void main(String[] args) {try {int[] arr = new int[5];System.out.println(arr[5]); // 抛出ArrayIndexOutOfBoundsException} catch (ArrayIndexOutOfBoundsException e) {System.out.println("数组越界异常:" + e.getMessage());}try {String str = null;System.out.println(str.length()); // 抛出NullPointerException} catch (NullPointerException e) {System.out.println("空指针异常:" + e.getMessage());}try {int d = 0;int a = 42 / d; // 抛出ArithmeticException} catch (ArithmeticException e) {System.out.println("除零异常:" + e.getMessage());}}
}
- 使用finally块
public class Main {public static void main(String[] args) {try {int[] arr = new int[5];System.out.println(arr[5]); // 抛出ArrayIndexOutOfBoundsException} catch (ArrayIndexOutOfBoundsException e) {System.out.println("数组越界异常:" + e.getMessage());} finally {System.out.println("finally块中的代码,无论是否发生异常都会执行。");}}
}
- 抛出异常
public class Main {public static void main(String[] args) {try {testMethod(0);} catch (IllegalArgumentException e) {System.out.println("捕获到异常:" + e.getMessage());}}public static void testMethod(int age) throws IllegalArgumentException {if (age < 0) {throw new IllegalArgumentException("年龄不能为负数");}System.out.println("年龄是:" + age);}
}
- 声明异常
import java.io.FileNotFoundException;public class Main {public static void main(String[] args) throws FileNotFoundException {readFile("nonexistent.txt");}public static void readFile(String filePath) throws FileNotFoundException {if (!filePath.equals("existent.txt")) {throw new FileNotFoundException("文件不存在");}System.out.println("文件读取成功");}
}
- 多个catch块
public class Main {public static void main(String[] args) {try {int a = Integer.parseInt(args[0]);int b = 42 / a;int[] c = {1};c[42] = 99;} catch (ArithmeticException e) {System.out.println("除零异常:" + e.getMessage());} catch (ArrayIndexOutOfBoundsException e) {System.out.println("数组越界异常:" + e.getMessage());} catch (NumberFormatException e) {System.out.println("数字格式异常:" + e.getMessage());}System.out.println("异常处理完毕");}
}
- 嵌套try-catch块
public class Main {public static void main(String[] args) {try {int a = Integer.parseInt(args[0]);int b = 42 / a;try {if (a == 1) {a = a / (a - a); // 除零异常} else if (a == 2) {int[] c = {1};c[4] = 99; // 数组越界异常}} catch (ArithmeticException e) {System.out.println("内层除零异常:" + e.getMessage());} catch (ArrayIndexOutOfBoundsException e) {System.out.println("内层数组越界异常:" + e.getMessage());}} catch (NumberFormatException e) {System.out.println("数字格式异常:" + e.getMessage());} catch (ArrayIndexOutOfBoundsException | NullPointerException e) {System.out.println("数组越界或空指针异常:" + e.getMessage());}System.out.println("异常处理完毕");}
}
总结
通过掌握Java异常处理的基础知识,包括异常的概念、异常体系、异常分类以及异常处理的关键字,你可以编写更加健壮和可靠的Java程序。通过示例代码,你可以看到如何捕获和处理异常、使用finally块进行资源清理、抛出和声明异常,以及如何处理多个不同类型的异常。
以下是一些具体的Java异常处理案例,涵盖了编译时异常、运行时异常以及自定义异常等方面:
编译时异常处理案例
-
文件未找到异常(FileNotFoundException)
- 场景:在尝试打开一个不存在的文件时,会抛出此异常。
- 示例代码:
import java.io.File; import java.io.FileInputStream; import java.io.IOException;public class FileNotFoundExceptionExample {public static void main(String[] args) {File file = new File("./nonexistentfile.txt");try (FileInputStream inputStream = new FileInputStream(file)) {// 尝试读取文件内容} catch (FileNotFoundException e) {System.err.println("文件未找到: " + e.getMessage());} catch (IOException e) {// 处理其他IO异常e.printStackTrace();}} }
-
类型转换异常(ClassCastException)
- 场景:在将对象强制转换为不兼容类型时,会抛出此异常。
- 示例代码:
public class ClassCastExceptionExample {public static void main(String[] args) {Object obj = "Hello";try {String str = (String) obj; // 实际上obj是String类型,这里不会抛出异常// 但如果obj是其他类型,比如Integer,就会抛出ClassCastException} catch (ClassCastException e) {System.err.println("类型转换异常: " + e.getMessage());}} }
- 注意:在实际代码中,应避免将obj声明为其他类型来触发异常,此示例仅用于说明异常类型。
运行时异常处理案例
-
数组越界异常(ArrayIndexOutOfBoundsException)
- 场景:在访问数组时,如果索引超出数组的有效范围,就会抛出此异常。
- 示例代码:
public class ArrayIndexOutOfBoundsExceptionExample {public static void main(String[] args) {int[] arr = new int[5];try {System.out.println(arr[5]); // 索引5超出数组范围,抛出异常} catch (ArrayIndexOutOfBoundsException e) {System.err.println("数组越界异常: " + e.getMessage());}} }
-
空指针异常(NullPointerException)
- 场景:在尝试使用未初始化(或已初始化为null)的对象时,会抛出此异常。
- 示例代码:
public class NullPointerExceptionExample {public static void main(String[] args) {String str = null;try {System.out.println(str.length()); // str为null,调用length()方法时抛出异常} catch (NullPointerException e) {System.err.println("空指针异常: " + e.getMessage());}} }
-
算术异常(ArithmeticException)
- 场景:在发生数学错误时(如除以零),会抛出此异常。
- 示例代码:
public class ArithmeticExceptionExample {public static void main(String[] args) {try {int result = 10 / 0; // 除以零,抛出异常System.out.println(result);} catch (ArithmeticException e) {System.err.println("算术异常: " + e.getMessage());}} }
自定义异常处理案例
-
自定义异常类
- 场景:当需要定义特定于应用程序的异常时,可以创建自定义异常类。
- 示例代码:
public class CustomException extends Exception {private String errorMessage;public CustomException(String errorMessage) {this.errorMessage = errorMessage;}public String getErrorMessage() {return errorMessage;} }
-
使用自定义异常
- 场景:在应用程序中抛出并捕获自定义异常。
- 示例代码:
public class CustomExceptionExample {public static void main(String[] args) {try {throw new CustomException("自定义异常信息");} catch (CustomException e) {System.err.println("捕获到自定义异常: " + e.getErrorMessage());}} }
这些案例涵盖了Java异常处理的不同方面,包括编译时异常、运行时异常以及自定义异常的处理。通过这些案例,可以更好地理解Java异常处理机制,并在实际编程中灵活运用。