综述
当try语句中出现异常是时,会执行catch中的语句,java运行时系统会自动将catch括号中的Exception e 初始化,也就是实例化Exception类型的对象。e是此对象异常名称。然后e(引用)会自动调用Exception类中指定的方法,就会e.printStackTrace()。printStackTrace()方法的意思是:在命令行打印异常信息在程序中出错的位置及原因。
java抛出异常的常见的三种方法:
- System.out.println(e.toString): A extends ---> B extends ----> C 除了标准异常外,只打印at A 然后再向外层层输出。
- e.printStackTrace() 除了标准异常外,打印 at C at B at A .... 再向外层调查, 会打出详细异常,异常名称,出错位置,便于调试用..
- 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() 可能会导致锁死!!!
- 短时间内大量请求访问此接口 -> 代码本身有问题,很多情况下抛异常 -> e.printStackTrace() 来打印异常到控制台 -> 产生错误堆栈字符串到字符串池内存空间 -> 此内存空间一下子被占满了 -> 开始在此内存空间产出字符串的线程还没完全生产完整,就没空间了 -> 大量线程产出字符串产出到一半,等在这儿(等有内存了继续搞啊)-> 相互等待,等内存,锁死了,整个应用挂掉了。
- 使用日志文件进行记录:logger.error(入参or返回结果 + "_" + e.getMessage(), e)