zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    Access, SQL Server, and Oracle数据类型的对应关系
    [转]SQL Server 2005 从差异备份还原数据库
    疲惫
    关于在cmd命令里的路径包含空格的问题
    导Excel时的科学计数法问题
    [转]SQL SERVER 2005 备份与恢复简介
    [转]用C#创建Windows Service
    [转] vb.net option
    [转]sql server profiler only TrueType fonts are supported. this is not a truetype font
    进程、线程、协程之概念理解[转帖]
  • 原文地址:https://www.cnblogs.com/Demrystv/p/13091787.html
Copyright © 2011-2022 走看看