如何处理UncaughtException异常

  • 为什么要处理UncaughtException异常
  • 怎么处理UncaughtException异常
    • 线程很容易被发现,子线程中的异常不易被发现。
    • 子线程抛出的异常无法使用传统方法捕获。
    • 直接捕获异常可以提高代码的健壮性。
    • 使用UncaughtExceptionHandler处理未捕获的异常

为什么要处理UncaughtException异常

在一个项目中,会有很多UncaughtException异常。如果这些异常没有处理,就有可能把异常信息返回给前端,黑客看到这些异常的堆栈信息就可以分析我们的代码,找到代码中的漏洞,进行一些攻击。

怎么处理UncaughtException异常

一般使用UncaughtExceptionHandler处理未捕获的异常。原因有以下三点:

线程很容易被发现,子线程中的异常不易被发现。

/**
* 主线程中的异常容易发现,子线程中的异常不容易发现。
* 1:主线程抛出异常会导致程序终止
* 2:子线程抛出异常会导致线程终止,程序会继续执行
*/
public class ExceptionInChildThread implements Runnable{public static void main(String[] args) throws InterruptedException {Thread thread = new Thread(new ExceptionInChildThread());thread.start();for (int i = 0; i < 1000; i++) {System.out.println(i);if (i == 900){throw new RuntimeException();}}Thread.sleep(1);}@Overridepublic void run() {try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}throw new RuntimeException();}
}

执行以上代码可以看到,子线程抛出RuntimeException后,主线程还在执行,但主线程抛出RuntimeException后,程序立刻终止了。

子线程抛出的异常无法使用传统方法捕获。

/**
* 无法在主线程中直接捕获子线程异常。
*/
public class UncaughtExceptionDirect implements Runnable{public static void main(String[] args) {Thread thread1 = new Thread(new ExceptionInChildThread());Thread thread2 = new Thread(new ExceptionInChildThread());Thread thread3 = new Thread(new ExceptionInChildThread());// 期望捕获到thread1的异常后,thread2和thread3就不会执行try {thread1.start();Thread.sleep(10);thread2.start();Thread.sleep(10);thread3.start();}catch (Exception e){System.out.println("子线程的异常被捕获到了");}}@Overridepublic void run() {throw new RuntimeException();}
}

执行结果

Exception in thread "Thread-0" java.lang.RuntimeExceptionat theadcoreknowledge.uncaughtexception.ExceptionInChildThread.run(ExceptionInChildThread.java:30)at java.lang.Thread.run(Thread.java:748)
Exception in thread "Thread-1" java.lang.RuntimeExceptionat theadcoreknowledge.uncaughtexception.ExceptionInChildThread.run(ExceptionInChildThread.java:30)at java.lang.Thread.run(Thread.java:748)
Exception in thread "Thread-2" java.lang.RuntimeExceptionat theadcoreknowledge.uncaughtexception.ExceptionInChildThread.run(ExceptionInChildThread.java:30)at java.lang.Thread.run(Thread.java:748)

从结果上看,我们使用try catch没有被捕获到子线程的异常。

直接捕获异常可以提高代码的健壮性。

子线程抛出异常后,子线程会直接进入终止状态,一些业务得不到处理。所有我们需要对异常进行捕获,进行一些相应的处理,以提高代码的健壮性。

使用UncaughtExceptionHandler处理未捕获的异常

使用UncaughtExceptionHandler处理未捕获的异常步骤:
1:创建我们的未捕获异常处理器处理器。只需要实现Thread.UncaughtExceptionHandler接口的uncaughtException方法。
2:使用Thread.setDefaultUncaughtExceptionHandler将我的未捕获异常处理器设置为Thread的默认异常处理器。

// 实现我们自己的未捕获异常处理器
public class OwnUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler {@Overridepublic void uncaughtException(Thread t, Throwable e) {System.out.println("捕获了" + t.getName() + "线程的异常");}public static void main(String[] args) {Thread.setDefaultUncaughtExceptionHandler(new OwnUncaughtExceptionHandler());new Thread(new ExceptionInChildThread()).start();}
}class ExceptionInChild implements Runnable{@Overridepublic void run() {throw new RuntimeException();}
}

执行结果:

捕获了Thread-0线程的异常

子线程的异常在主线程中成功捕获到了。

如何处理UncaughtException异常相关推荐

  1. 如何处理Express异常?

    如何处理Express异常? 参考文章: (1)如何处理Express异常? (2)https://www.cnblogs.com/fundebug/p/8353031.html 备忘一下.

  2. 如何处理java异常

    在开发业务系统中,我们目前绝大多数采用MVC模式,但是往往有人把service跟controller紧紧的耦合在一起,甚至直接使用Threadlocal来隐式传值,并且复杂的逻辑几乎只能使用servi ...

  3. html视频资源加载出错处理,如何处理前端异常

    错误类型数据 错误类型主要是运行过程中的前端报错,Javascript原生提供Error构造函数,所有抛出的错误都是它的实例.Error实例对象有以下属性属性描述message错误提示信息 name错 ...

  4. view [bootstrap-4] not found如何解决_Dubbo如何处理业务异常,这个一定要知道哦

    前言 我们在开发应用系统时,不可避免的要使用到我们自己定义的异常,所以我们一般通常会用到自定义的业务异常类BusinessException,这个异常会继承extends RuntimeExcepti ...

  5. java如何处理tcp异常断开_(转)TCP连接异常断开检测

    TCP是一种面向连接的协议,连接的建立和断开需要通过收发相应的分节来实现.某些时候,由于网络的故障或是一方主机的突然崩溃而另一方无法检测到,以致始终保持着不存在的连接.下面介绍一种方法来检测这种异常断 ...

  6. 如何处理Java异常及常见异常

    六种异常处理的陋习 你觉得自己是一个Java专家吗?是否肯定自己已经全面掌握了Java的异常处理机制?在下面这段代码中,你能够迅速找出异常处理的六个问题吗? 1 OutputStreamWriter ...

  7. java如何处理tcp异常断开_针对TCP连接异常断开的分析

    我们知道,一个基于TCP/IP的客户端-服务器的程序中,正常情况下,我会是启动服务器使其在一个端口上监听请求,等待客户端的连接:通过TCP的三次握手,客户端能够通过socket建立一个到服务器的连接: ...

  8. android 多线程 崩溃,Android异常崩溃捕获

    Android系统碎片化造成应用程序崩溃严重,在模拟器上运行良好的程序安装到某款手机上说不定就会出现崩溃的现象.而且,往往都是程序发布之后在用户端出现了崩溃现象.所以在程序发布出去之后,如果出现了崩溃 ...

  9. 异常的深入研究与分析

    前言 本文是异常内容的集大成者,力求全面,深入的异常知识研究与分析.本文由金丝燕网独家撰写,参考众多网上资源,经过内容辨别取舍,文字格式校验等步骤编辑而成,以飨读者.对于本文的内容,建议小白需要多多思 ...

最新文章

  1. mycat 10 分钟轻松入门
  2. java application文件夹_关于java:如何动态获取Spring Boot Application jar的父文件夹路径?...
  3. 网易云信,发送验证码短信C#版代码
  4. nvcc fatal : Unsupported gpu architecture 'compute_11'
  5. android 代码 升级rom,ROM之家简析:Android手机系统怎么升级
  6. Java怎么按照字母对单词排序_将一段字符串文本中的每个单词提取出来后按照字母顺序排序...
  7. 含有共轭复数根的Jordan分解
  8. 数据库优化(超级详细),转文,值得一读
  9. redis工具 :springboot使用redis
  10. 爬虫 【第一章】爬虫基本原理
  11. 怎么彻底删除SQLServer2008 卸载SQLServer200
  12. 数据库两大必备神器:索引和锁底层原理是什么!
  13. 高并发抢红包系统红包随机金额生成算法
  14. Linux系统编程1——系统函数
  15. MYSQL数据库DML常见的命令
  16. stm32+esp8266(wifi模块)+贝壳物联+开关控制
  17. 最详细tron节点搭建同步教程
  18. Ruby 安装 - Windows
  19. AutoJS4.1.0实战教程 ---火热持续更新中
  20. 南开大学python编程基础_《Python编程基础》20春期末考核(参考答案)南开大学 答案...

热门文章

  1. jsdoc安装与配置
  2. android 蓝牙BluetoothAdapter扫描、获蓝牙设备、已联设备列表
  3. 14个实用的CSS在线实例教程
  4. 数组、列向量和行向量区别
  5. Nexus 5手机使用Nexmon工具获取CSI信息
  6. MySQL错误提示(10061)解决方法
  7. 1046 划拳 (15 分)
  8. python int64_python-尽管声明了dtype = int64,但还是得到了N...
  9. MSP430F5529 (六)定时器Timer_A
  10. 谁说0基础参加北京培训不能成为UI设计师