1、异常
1.1、运行时异常
运行时异常是指在程序运行过程中可能会出现的异常,这些异常通常是由程序逻辑错误引起的,而不是外部环境或用户输入造成的。在Java中,运行时异常是Exception类的子类,但是它们不需要在方法声明中被显式地捕获或声明。下面是关于Java运行时异常的详细内容:
1. 异常说明
- 运行时异常是指继承自RuntimeException类的异常。它们通常表示程序中的逻辑错误或错误的使用方式,例如空指针引用、数组下标越界、类型转换错误等。
- 与受检异常(checked exception)不同,运行时异常不需要在方法声明中被显式地捕获或声明,程序员可以选择捕获或不捕获这些异常。
2. 异常示例
- 空指针异常(NullPointerException):当尝试访问一个空对象的属性或调用空对象的方法时,会抛出空指针异常。
- 数组下标越界异常(ArrayIndexOutOfBoundsException):当尝试访问数组中不存在的索引位置时,会抛出数组下标越界异常。
- 类型转换异常(ClassCastException):当尝试将一个对象转换为不兼容的类型时,会抛出类型转换异常。
3. 异常处理
- 程序员可以选择捕获运行时异常并进行处理,也可以不捕获,让程序在出现运行时异常时直接终止并抛出异常信息。
- 通常建议对可能出现的运行时异常进行适当的处理,以避免程序意外终止或产生不可预测的结果。
4. 示例代码
public class RuntimeExceptionExample {public static void main(String[] args) {try {String str = null;System.out.println(str.length()); // 可能抛出空指针异常} catch (NullPointerException e) {System.out.println("发生空指针异常:" + e.getMessage());}}
}
在这个示例中,我们展示了一个可能抛出空指针异常的情况,并使用try-catch块来捕获并处理这个异常。
1.2、受检异常
受检异常(Checked Exception)是指在Java中需要在方法声明中显式地捕获或声明抛出的异常。这些异常通常是由外部环境或用户输入造成的,程序员需要在代码中显式地处理这些异常,以确保程序的稳定性和可靠性。以下是关于Java受检异常的详细内容:
1. 异常说明
- 受检异常是指继承自Exception类但不是RuntimeException类的异常。它们通常表示程序在运行过程中遇到的外部环境或用户输入等问题,需要在方法声明中显式地进行处理。
- 与运行时异常不同,受检异常必须在方法声明中通过throws关键字声明抛出,或者在方法内部通过try-catch块进行捕获和处理。
2. 异常示例
- 文件未找到异常(FileNotFoundException):当尝试打开一个不存在的文件时,会抛出文件未找到异常。
- 输入输出异常(IOException):表示输入输出操作中可能出现的各种异常情况,例如文件读写错误、网络连接问题等。
- SQL异常(SQLException):在使用JDBC进行数据库操作时可能会遇到各种SQL相关的异常。
3. 异常处理
- 程序员需要在代码中显式地处理受检异常,可以通过在方法声明中使用throws关键字声明抛出异常,或者在方法内部使用try-catch块进行捕获和处理。
- 对于可能抛出受检异常的方法,调用者需要在调用时处理可能的异常情况,以确保程序的稳定性和可靠性。
4. 示例代码
import java.io.*;public class CheckedExceptionExample {public static void main(String[] args) {try {FileReader file = new FileReader("test.txt"); // 可能抛出文件未找到异常BufferedReader br = new BufferedReader(file);String line;while ((line = br.readLine()) != null) {System.out.println(line);}br.close();} catch (FileNotFoundException e) {System.out.println("找不到文件:" + e.getMessage());} catch (IOException e) {System.out.println("IO异常:" + e.getMessage());}}
}
在这个示例中,我们展示了一个可能抛出文件未找到异常和IO异常的情况,并使用try-catch块来捕获并处理这些异常。
1.3、项目使用(受检异常)
一般在service层处理受检异常,通过创建一个自定义的异常类,在需要的地方抛出自定义异常即可
1、自定义异常
public class CustomException extends Exception {private int code;private String message;public CustomException(int code, String message, Throwable cause) {super(message, cause);this.code = code;this.message = message;}public int getCode() {return code;}@Overridepublic String getMessage() {return message;}
}
在实际的业务场景下
2、service服务方:抛出自定义异常
public void handle2() throws CustomException {boolean isEmpty=false;if (!isEmpty){throw new CustomException("数组为空",500);}}
3、controller调用方:捕获自定义异常,并处理异常
public static void handle(){final Demo2 demo2 = new Demo2();try {System.out.println("我是demo1的方法");demo2.handle2();}catch (CustomException customException){System.out.println("捕获异常CustomException "+customException.getMessage()+customException.getCode());customException.printStackTrace();}catch (Exception e){System.out.println("demo1的方法handle捕获到异常了");System.out.println("-------------"+e.getLocalizedMessage());e.printStackTrace();System.out.println("#######");}}
1.4、项目使用(运行时异常)
可以直接在service层的最外层进行抛出异常或者直接捕获异常并处理异常