java中的异常

[Java中的异常总结详解(异常类型、声明异常、抛出异常、捕获异常)_声明异常的关键字是 ,抛出异常的关键字是 ,捕捉异常的关键字是-CSDN博客](https://blog.csdn.net/m0_46316970/article/details/119898445)
  • 在程序运行过程中,如果 JVM 检测出一个不可能执行的操作,就会出现运行时错误(runtime error)。
  • 异常就是程序在运行过程中出现的一些错误,我们通过面向对象的思想,把这些错误也用类来描述,那么一旦产生一个错误,即就是创建了某一个错误的对象,这个对象就是我们所说的异常对象。
  • RuntimeException 的任何子类都无需在 throws 子句中进行声明,指的就是这些问题不需要提前被预防(本质上也可以的,只不过没必要),因为只有在真正运行的时候才能发现是否发生问题,一旦在运行期间发生了问题,则一般不会修正,程序直接终端。
  • 系统錯误(system error) 是由 Java 虚拟机抛出的,用 Error 类表示。Error 类描述的是内部系统错误。这样的错误很少发生,Error不能被抛出和try
  • 异常实际上是方法退出的另外一种方式。
  • 异常会在方法调用栈中传递的,某个线程发生了异常,且并没有进行try,那么只是这个线程会挂掉,整个服务或者说main线程不会挂掉的。

checked和unchecked

+ 必须捕获的异常,包括 Exception 及其子类,但不包括 RuntimeException 及其子类,这种类型的异常称为Checked Exception。这种异常在我们写代码的时候IDEA就会提醒我们要么try或者throws + 不需要捕获的异常,包括 Error 及其子类, RuntimeException 及其子类。

自定义异常

[自定义异常类 - deng-hui - 博客园](https://www.cnblogs.com/denghui-study/p/14327442.html)

异常栈

[一篇文章让你读懂Java异常栈信息-CSDN博客](https://blog.csdn.net/tianjindong0804/article/details/105117779)
  • lombook中的@SneakyThrows注解可以减少声明异常
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Example {

@SneakyThrows
public void throwCheckedException() {
throw new Exception("Checked exception thrown");
}

@SneakyThrows
public void throwUncheckedException() {
throw new RuntimeException("Unchecked exception thrown");
}

public static void main(String[] args) {
Example example = new Example();
example.throwCheckedException();
example.throwUncheckedException();
}
}

Spring中的异常处理机制

+ spring在对于控制层每个路径下的请求,如果某个请求抛出了异常并不会影响整个spring项目的关闭,这是因为在RequestMappingHandlerAdapter对控制层中代码抛出的异常做出了try

受检异常的思考

[滑动验证页面](https://segmentfault.com/a/1190000044581225)(很值得看一下,了解其他语言为啥没有checked异常)

@SneakyThrows

Lombok 的 @SneakyThrows 注解允许您在不使用 throws 声明的情况下抛出选中的异常。当您需要从限制性很强的接口(如 Runnable)中的方法引发异常时,这会派上用场。假设我们从 Runnable 中抛出一个异常;它只会传递给线程的未经处理的异常处理程序。
  • 对于受检异常,该注解可以不用throws抛出异常,这样就算某个方法改动throws的异常发生了变化,该方法中调用链的其他方法不用修改其throws
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class Main {
public static void main(String[] args) {
try {
new Main().f2();
}catch (Exception e){
System.out.println(e.getMessage());
}
/* try {
throwSneakyIOExceptionUsingLombok();
}catch (Exception e){
System.out.println(e.getMessage());
}*/
// new Main().f2();
}
public void f2() {
String filename = "test.txt";
f1(filename);
}
@SneakyThrows
public String f1(String filename) {
Scanner scanner = new Scanner(new File(filename));
return scanner.next();
}
@SneakyThrows
public static void throwSneakyIOExceptionUsingLombok() {
throw new IOException("lombok sneaky");
}
}

1.上面的方法f1不添加SneakyThrows注解就需要在f1方法后面添加throws FileNotFoundException;同时调用f1方法的f2和main也要添加;添加了SneakyThrows注解后,如果后面f1方法改了后,其抛出的异常发生了变化就可以,如果没有使用SneakyThrows注解就要修改f2和main方法的throws,使用了该注解就可以不用这样了。

  • 当发生了是非检查异常的时候,使用了该注解和没有使用感觉区别不大:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package org.example;

import lombok.SneakyThrows;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Scanner;

public class Main {
public static void main(String[] args) {
/* try {
new Main().f2();
}catch (Exception e){
System.out.println(e.getMessage());
}*/
try {
throwSneakyIOExceptionUsingLombok();
}catch (Exception e){
System.out.println(e.getMessage());
}
// new Main().f2();
}
public void f2() {
String filename = "test.txt";
f1(filename);
}
@SneakyThrows
public String f1(String filename) {
Scanner scanner = new Scanner(new File(filename));
return scanner.next();
}
@SneakyThrows
public static void throwSneakyIOExceptionUsingLombok() {
throw new IOException("lombok sneaky");
}
}