摘录
在 Java 中,所有的异常都有一个共同的祖先 java.lang
包中的 Throwable
类。Throwable
类有两个重要的子类:
Exception
:程序本身可以处理的异常Error
:Error
属于程序无法处理的错误
Exception分为:
Checked Exception 即 受检查异常,不处理编译不通过
Unchecked Exception 即 不受检查异常 ,RuntimeException
及其子类都统称为非受检查异常,常见的有
NullPointerException
(空指针错误)
IllegalArgumentException
(参数错误比如方法入参类型错误)
NumberFormatException
(字符串转换为数字格式错误,IllegalArgumentException
的子类)
ArrayIndexOutOfBoundsException
(数组越界错误)
ClassCastException
(类型转换错误)
ArithmeticException
(算术错误)
SecurityException
(安全错误比如权限不够)
UnsupportedOperationException
(不支持的操作错误比如重复创建同一用户)
package cn.xx.testbean;
/**
* 运行时异常
*/
public class TestIndex {
public static void main(String[] args) {
//java.lang.ArrayIndexOutOfBoundsException
// String[] aa = new String[3];
// System.out.println(aa.length);
// aa[0] = "a";
// aa[1] = "a";
// aa[2] = "a";
// aa[3] = "a";
//java.lang.NullPointerException
// String s=null;
// System.out.println(s.toString());
//java.lang.NumberFormatException
// Integer i = Integer.valueOf("s");
// System.out.println(i);
//java.lang.ClassCastException
// Object user = new User("111");
// Dept dept = (Dept)user;
//java.lang.ArithmeticException
// int i = 1 / 0;
}
}
总结
-
异常(exception)分两种,一种可以不处理(运行时异常,即代码运行起来有可能出现的异常,RuntimeException),一种必须要处理(非运行时异常,也叫受检查异常,编译阶段受检查的意思,不处理编译不过去)。
-
非运行时异常和运行时异常都是异常,都需要处理。虽然从代码层面说,只有非运行时异常是需要处理的
-
可以根据业务逻辑判断,满足条件,抛出异常
package cn.xx.testbean.service.impl; import cn.xx.testbean.service.UserService; import org.springframework.stereotype.Service; import java.io.IOException; import java.sql.SQLException; @Service public class UserServiceImpl implements UserService { @Override public void use(String s) { if (s == null || "".equals(s)) { throw new RuntimeException("错误!"); } } }
-
对于异常(exception),有两种操作
-
处理,即try,catch
-
不处理,throws,声明当前方法有异常,当前方法被调用时需要针对异常进行操作
那么可以一直不处理吗?
可以。
可以当前方法不处理,调用这个方法时也不处理。
比如:
Service层某个方法出现了一个异常,当前Service不处理,throws这个异常;
Controller层调用Service层的这个方法也不处理,继续throws这个异常
@RestController public class UserController { @Autowired private UserService userService @GetMapping("/handle") public void handle() throws FileNotFoundException { userService.handle(); } }
public interface UserService { void handle() throws FileNotFoundException; }
@Service public class UserServiceImpl implements UserService { @Override public void handle() throws FileNotFoundException { new FileInputStream(""); } }
访问这个接口, 控制台打印:
2024-12-18T17:00:22.326+08:00 ERROR 4660 --- [testbean] [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception java.io.FileNotFoundException: (系统找不到指定的路径。) at java.base/java.io.FileInputStream.open0(Native Method) ~[na:na] at java.base/java.io.FileInputStream.open(FileInputStream.java:216) ~[na:na] at java.base/java.io.FileInputStream.<init>(FileInputStream.java:157) ~[na:na] at java.base/java.io.FileInputStream.<init>(FileInputStream.java:111) ~[na:na] at cn.xx.testbean.service.impl.UserServiceImpl.handle(UserServiceImpl.java:23)
-