Java中catch到的Exception的解析

综述

  当try语句中出现异常是时,会执行catch中的语句,java运行时系统会自动将catch括号中的Exception e 初始化,也就是实例化Exception类型的对象。e是此对象异常名称。然后e(引用)会自动调用Exception类中指定的方法,就会e.printStackTrace()。printStackTrace()方法的意思是:在命令行打印异常信息在程序中出错的位置及原因。

java抛出异常的常见的三种方法:

  1. System.out.println(e.toString): A  extends ---> B  extends ----> C  除了标准异常外,只打印at A 然后再向外层层输出。
  2.  e.printStackTrace()   除了标准异常外,打印  at C  at B at A .... 再向外层调查, 会打出详细异常,异常名称,出错位置,便于调试用.. 
  3.  e.getMessage(); 只会获得具体的异常名称. 比如说NullPoint 空指针,就告诉你说是空指针..

  举例说明下:

 1 示例代码1:
 2 public class TestInfo {
 3     private static String str =null;
 4     public static void main(String[] args) {
 5         System.out.println("test exception");
 6         try {
 7             if(str.equals("name")){
 8                 System.out.println("test exception");
 9             }
10         } catch (Exception e) {
11             System.out.println(e.toString());
12             System.out.println(e.getMessage());
13         }
14     }
15 }
16 输出结果:
17 java.lang.NullPointerException
18 null
19 
20 示例代码2:
21 public class TestInfo {
22     private static int m = 0;
23     public static void main(String[] args) {
24         System.out.println("test exception");
25         try {
26             m = 899/0;
27         } catch (Exception e) {
28             System.out.println(e.toString());
29             System.out.println(e.getMessage());
30         }
31     }
32 }
33 输出结果:
34 java.lang.ArithmeticException: / by zero
35 / by zero

  由此可得出结论:e.toString()获取的信息包括异常类型和异常详细消息;e.getMessage()只是获取了异常的详细消息字符串。

问题

  e.printStackTrace() 可能会导致锁死!!!

  1. 短时间内大量请求访问此接口 -> 代码本身有问题,很多情况下抛异常  -> e.printStackTrace() 来打印异常到控制台 -> 产生错误堆栈字符串到字符串池内存空间 -> 此内存空间一下子被占满了 -> 开始在此内存空间产出字符串的线程还没完全生产完整,就没空间了 ->  大量线程产出字符串产出到一半,等在这儿(等有内存了继续搞啊)-> 相互等待,等内存,锁死了,整个应用挂掉了。
  2. 使用日志文件进行记录:logger.error(入参or返回结果 + "_" + e.getMessage(), e)

 

posted @ 2020-06-12 10:47  Demrystv  阅读(964)  评论(0编辑  收藏  举报