Throwable 类是 Java 语言中所有错误或异常的超类,是对所有异常进行整合的一个普通类。它的作用就是能够提取保存在堆栈中的错误信息。
成员方法:
-
public String getMessage():返回此 throwable 的详细消息字符串
-
public String toString():获取异常类名和异常信息。
-
public void printStackTrace():获取异常类名和异常信息,以及异常出现在程序中的位置。
-
public void printStackTrace(PrintStream s):通常用该方法将异常内容保存在日志文件中,以便查阅。
异常的分类
-
异常(Exception)
-
编译时异常: 凡是Exception或者是Exception的子类都成为编译时异常,这种是可以解决的,一般编译不通过
-
运行时异常: 凡是RuntimeException或者是RuntimeException的子类都成为运行时异常,这种也是可以解决的,一般都是代码不够严谨或者逻辑错误
-
-
错误 (Error)
处理异常的方式
1. try catch finally
try { 可能出现问题的代码; } catch(异常类名 异常对象) { 异常处理的代码 } finally { 释放未关闭的资源 }
ps:在catch代码块中仍然可以throw异常,方面打印出完整的堆栈信息和错误信息。
2. throw throws
1.抛出RuntimeException的情况
在方法内抛出运行时异常
@Service public class ExceptionServiceImpl implements ExceptionService{ /** * 异常测试 */ @Override public void exceptionTest(String message) { try { message = "pxy帅炸"; } catch (RuntimeException e) { //捕获到异常可以直接打印信息,不用抛出,在这里抛出是因为可以打印出更详细的堆栈信息 throw new RuntimeException(e); } } }
在方法声明时声明运行时异常
@Service public class ExceptionServiceImpl implements ExceptionService{ /** * 异常测试 */ @Override public void exceptionTest(String message) throws RuntimeException{ message = "pxy帅炸"; } }
发现两种情况在controller中既不用try异常,也不用throw异常,代码如下
@RestController @RequestMapping("/exception") public class ExceptionController { @Autowired private ExceptionService exceptionService; /** * 测试异常的处理方法 */ @PostMapping("/controller") public void exceptionController(String message) { exceptionService.exceptionTest(message); } }
总结:调用有RuntimeException时的函数时,可以处理也可以不处理。
2.抛出Exception的情况
在方法中抛出Exception时,必须在方法声明的时候 throws Exception 。
@Service public class ExceptionServiceImpl implements ExceptionService{ /** * 异常测试 */ @Override public void exceptionTest(String message) throws Exception { message = "pxy帅炸"; throw new Exception(); } }
使用调用抛出Exception函数的方法,两种处理方法
1.必须在方法声明处throws Exception,继续将异常向上抛出
@RestController @RequestMapping("/exception") public class ExceptionController { @Autowired private ExceptionService exceptionService; /** * 测试异常的处理方法 */ @PostMapping("/controller") public void exceptionController(String message) throws Exception{ exceptionService.exceptionTest(message); } }
2.直接在此处处理并捕获异常
@RestController @RequestMapping("/exception") public class ExceptionController { @Autowired private ExceptionService exceptionService; /** * 测试异常的处理方法 */ @PostMapping("/controller") public void exceptionController(String message) { try { exceptionService.exceptionTest(message); } catch (Exception e) { e.printStackTrace(); e.getMessage(); } } }