廖雪峰Java3异常处理-1错误处理-3抛出异常
1.异常的传播
当某个方法抛出异常时:
- 如果当前方法没有捕获,异常就被抛到上层调用方法
- 直到遇到某个try...catch被捕获
- 使用printStackTrace()打印处方法的调用栈
import java.lang.String;
public class Main {
public static void main(String[] args) {
try{
process1();
}catch (Exception e){
e.printStackTrace();//对于调试错误非常有用
}
}
static void process1(){
process2();
}
static void process2() {
Integer.parseInt(null);
}
}

2.抛出异常
- 创建某个Exception的实例
- 用throw语句抛出
import java.lang.String;
public class Main {
public static void main(String[] args) {
try{
process1("");
}catch (Exception e){
e.printStackTrace();
}
}
static void process1(String s){
throw new IllegalArgumentException();
}
}

3.转换异常与持有原有异常
3.1转换异常
如果一个方法捕获了某个异常后,又在catch子句中抛出新的异常,就相当与把抛出的异常类型“转换”了。
import java.lang.String;
public class Main {
public static void main(String[] args) {
process1("");
}
static void process1(String s){
try{
process2(s);
}catch (NullPointerException e){
throw new IllegalArgumentException();//捕获NullPointerException,抛出IllegalArgumentException
}
}
static void process2(String s){
throw new NullPointerException();
}
}

## 3.2转换的异常持有原有异常
上例中存在的问题:新的异常丢失了原始异常信息,只追踪到process1。如何让新的Exception可以持有原始异常信息?
解决方法:将异常传入即可。
throw new IllegalArgumentException(e);
```#java
import java.lang.String;
public class Main {
public static void main(String[] args) {
process1("");
}
static void process1(String s){
try{
process2(s);
}catch (NullPointerException e){
throw new IllegalArgumentException(e);
}
}
static void process2(String s){
throw new NullPointerException();
}
}
<img src="https://img2018.cnblogs.com/blog/1418970/201901/1418970-20190129145215827-451969646.png" width="700" />
# 4.被屏蔽的异常suppressed exception
在抛出异常前,finally语句会保证执行。
<font color=#9400D3>如果finally语句抛出异常,则catch语句不再抛出,没有被抛出的异常被称为“被屏蔽”的异常(suppressed exception)</font>
```#java
import java.lang.String;
public class Main {
public static void main(String[] args) {
try{
process1("");
}catch (Exception e){
System.out.println("catched");
throw new RuntimeException(e);//“被屏蔽”的异常(suppressed exception)
}finally {
System.out.println("finally");
//throw new NullPointerException();
}
}
static void process1(String s){
throw new IllegalArgumentException();
}
}
finally中不抛出异常

finally中抛出异常
throw new NullPointerException();去掉注释

因此尽量避免在finally中抛出异常
5.如何保存所有的异常信息
- 使用origin变量保存原始异常
- 如果存在原始异常,用addSuppressed()添加新异常
- 如果存在原始异常,或者新异常,最后在finally抛出
import java.lang.String;
public class Main {
public static void main(String[] args) throws Exception {
Exception origin = null;
try{
process1("");
}catch (Exception e){
origin = e;
System.out.println("catch捕捉到了");
throw new RuntimeException("可能屏蔽的异常"+e);
}finally {
System.out.println("finally");
try{
throw new NullPointerException("finally 抛出的异常");
}catch (Exception e){
if (origin != null ){
origin.addSuppressed(e);
}else{
origin = e;
}
}
if (origin != null){
throw origin;
}
}
}
static void process1(String s){
throw new IllegalArgumentException("process1方法异常了,32");
}
}

## 5.2获取所有的异常信息
因为一般不在finally中捕获异常,所以可以直接使用for循环将异常信息打印出来。
```#java
import java.lang.String;
public class Main {
public static void main(String[] args) throws Exception {
Exception origin = null;
try{
process1("");
}catch (Exception e){
e.printStackTrace();
for(Throwable t:e.getSuppressed()){
t.printStackTrace();
}
}finally {
System.out.println("finally");
}
}
static void process1(String s){
throw new IllegalArgumentException("process1方法异常了,32");
}
}
<img src="https://img2018.cnblogs.com/blog/1418970/201901/1418970-20190129173524625-1932720916.png" width="700" />
# 6.总结:
* printStackTrace()可以打印异常的传播栈,对于调试非常有用
* 捕获异常并再次抛出新的异常时,应该持有原有异常信息。即新抛出的异常应该包含原始异常。
* 如果在finally中抛出异常,应该把新抛出的异常添加到原有异常中
* 用getSuppressed()可以获取所有添加的Suppressed Exception
* 处理Suppressed Exception要求JDK>= 1.7
廖雪峰Java3异常处理-1错误处理-3抛出异常的更多相关文章
- 廖雪峰Java3异常处理-1错误处理-2捕获异常
1捕获异常 1.1 finally语句保证有无错误都会执行 try{...}catch (){...}finally{...} 使用try...catch捕获异常 可能发生异常的语句放在try{... ...
- 廖雪峰Java3异常处理-1错误处理-1Java的异常
1.计算机运行中的错误 在计算机程序运行的过程中,错误总会出现,不可避免的 用户输入错误 读写文件错误 网络错误.内存耗尽.无法连接打印机不可 String s = "abc"; ...
- 廖雪峰Java3异常处理-1错误处理-4自定义异常
JDK已有的异常: RuntimeException * NullPointerException * IndexOutOfBoundsException * SecurityException * ...
- 廖雪峰Java3异常处理-2断言和日志-3使用Commons Logging
Commons Logging是Apache创建的日志模块: 可以挂接不同的日志系统 可以通过配置文件指定挂接的日志系统 自动搜索并使用Log4j 如果Log4j不存在,使用JDK Logging(J ...
- 廖雪峰Java3异常处理-2断言和日志-1使用断言
1.断言 断言Assertion是一种程序调试方式 使用assert关键字 断言条件预期为true 如果断言失败,抛出AssertionError,停止程序 可选的断言消息,断言失败,就会抛出 pub ...
- 廖雪峰Java3异常处理-2断言和日志-4使用Log4j
1.Log4j Log4j是目前最流行的日志框架.有两个版本 1.x:Log4j 2.x:Log4j2 Log4j下载地址https://www.apache.org/dyn/closer.lua/l ...
- 廖雪峰Java3异常处理-2断言和日志-2使用JDK Logging
1.日志 为了取代System.out.println() 可以设置输出样式 可以设置输出级别,禁止某些级别输出 可以被重定向到文件 可以按包名控制日志级别 2.JDK内置Logging 在java. ...
- 廖雪峰Java-3流程控制-7for循环
for循环 for循环使用计数器实现循环 for循环条件需要设置:计数器初始值:循环前检测条件:每次循环后如何更新计数器 计数器变量通常命名为i int[] ns = {1,4,9,16,25}; f ...
- 爬虫:把廖雪峰的教程转换成 PDF 电子书
写爬虫似乎没有比用 Python 更合适了,Python 社区提供的爬虫工具多得让你眼花缭乱,各种拿来就可以直接用的 library 分分钟就可以写出一个爬虫出来,今天就琢磨着写一个爬虫,将廖雪峰的 ...
随机推荐
- python在图片上画矩形
python在图片上画矩形 image_path = '' image = cv2.imread(image_path) first_point = (100, 100) last_point = ( ...
- hdu3294 Girls' research manacher
One day, sailormoon girls are so delighted that they intend to research about palindromic strings. O ...
- 对中文进行MD5加密的注意事项(Java版,编码问题)
http://blog.csdn.net/tongdao/article/details/20690187 在工作中需要和第三方进行Http通信,在通信内容中有几个参数涉及到了中文.自己在进行MD5加 ...
- [原]android 链接错误
由于没有使用NDK的makefile, 而是把NDK的toolchain集成到现有的build system, 所以出现了诡异的错误: unsupported dynamic reloc R_ARM_ ...
- hotel管理
PS:这个界面
- Vue的路由动态重定向和导航守卫
一.重定向 重定向也是通过 routes 配置来完成,下面例子是从 /a 重定向到 /b: const router = new VueRouter({ routes: [ { path: '/a', ...
- 黑马-ssh
插件 Struts-plugin.xml 说明: Struts-plugin.xml文件是在tomcat服务器启动的时候加载的 该配置文件在classpath的根目录下 在每一个含有plugin字母的 ...
- php7 php-fpm 重启
PHP7中php.ini.php-fpm和www.conf的配置 http://www.tuicool.com/articles/NjmQNj6 php-fpm 关闭: kill -SIGINT ` ...
- c# AddMonths,你了解吗?
AddMonths:找到对应月的day,如果没有则取最后一个day var d1 = new DateTime(2017, 6, 30); var d2 = d1.AddMonths(-1);//20 ...
- RTP RTCP RTSP
1.RTP over UDP和RTP over RTSP有什么区别?2.RTP over RTSP是不是就是RTP over TCP?3.RTP over TCP 打包视频是不是要加4个字节的头,是 ...