异常相关注解
# 异常相关注解
@SneakyThrows
:
- 用于在方法声明中使用。它的作用是告诉编译器,在方法中抛出受检异常时,不需要显式地在方法签名中声明或捕获该异常。
- 将被注解的方法中的受检查异常(checked exception)转换为不受检查异常(unchecked exception)
- 编译器中相当于是被
try catch
了。 - 只会抛出一个异常。
- 可使得代码更加简洁。
- 在使用之前,请确保已经熟悉并理解所使用的注解的作用和影响。
总结:这个注解用在方法上,可以将方法中的代码用
try-catch
语句包裹起来,捕获异常并在catch
中用Lombok.sneakyThrow(e)
把异常抛出,可以使用@SneakyThrows(Exception.class)
的形式指定抛出哪种异常。
示例 1: 使用 @SneakyThrows
注解抛出异常
public class SneakyThrowsExample {
@SneakyThrows
public void doSomething() {
throw new Exception("An exception occurred.");
}
public static void main(String[] args) {
SneakyThrowsExample example = new SneakyThrowsExample();
example.doSomething();
}
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
示例 2: @SneakyThrows
注解与方法签名中的异常声明结合使用
public class SneakyThrowsExample {
@SneakyThrows(InterruptedException.class)
public void doSomething() {
Thread.sleep(1000);
}
public static void main(String[] args) {
SneakyThrowsExample example = new SneakyThrowsExample();
example.doSomething();
}
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
示例 3: 在 lambda 表达式中使用 @SneakyThrows
注解
public class SneakyThrowsExample {
public static void main(String[] args) {
Runnable runnable = () -> {
@SneakyThrows
String message = getMessage();
System.out.println(message);
};
Thread thread = new Thread(runnable);
thread.start();
}
public static String getMessage() throws InterruptedException {
Thread.sleep(1000);
return "Hello, world!";
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
使用 @SneakyThrows
注解后同时遇到空指针异常和不合法参数异常的情况:
public class ExceptionExample {
@SneakyThrows
public static void main(String[] args) {
String str = null;
int length = str.length(); // NullPointerException
int[] arr = new int[5];
int value = arr[10]; // ArrayIndexOutOfBoundsException
}
}
// 指定了异常也不会抛出两个异常
// @SneakyThrows({NullPointerException.class, ArrayIndexOutOfBoundsException.class})
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
控制台输出:
Exception in thread "main" java.lang.NullPointerException
at com.chenmeng.project.controller.ExceptionExample.main(ExceptionExample.java:9)
进程已结束,退出代码1
1
2
3
4
2
3
4
结果分析:
- 使用
@SneakyThrows
注解后,在方法体中同时遇到空指针异常(NullPointerException)和不合法参数异常(ArrayIndexOutOfBoundsException)时,控制台只显示了空指针异常的信息,而不会显示不合法参数异常的信息。 - 这是因为
@SneakyThrows
注解会将异常转换为通用的java.lang.Exception
类型,以通过编译。但是,由于只能抛出单个异常,因此只有第一个异常会被捕获和抛出,而后续的异常会被忽略。 - 即使指定了两个异常也只会抛出一个异常。
可阅读以下两篇文章:
上次更新: 2024/9/25 11:16:13