精华内容
下载资源
问答
  • 打印Java异常堆栈信息

    千次阅读 2017-12-26 15:35:35
    在开发Java应用程序的时候,遇到程序抛异常,我们通常会把抛异常时的运行时环境保存下来(写到日志文件或者在控制台中打印出来)。这样方便后续定位问题。 需要记录的运行时环境包含两部分内容:抛异常时的参数信息...

    背景

    在开发Java应用程序的时候,遇到程序抛异常,我们通常会把抛异常时的运行时环境保存下来(写到日志文件或者在控制台中打印出来)。这样方便后续定位问题。

    需要记录的运行时环境包含两部分内容:抛异常时的参数信息和函数调用堆栈。针对堆栈信息,如果直接调用Exception的getStackTrace方法获取将得到这样一句没用的信息:

    [Ljava.lang.StackTraceElement;@4361bd48

    我们希望能打印完整的调用堆栈,像这样:

    com.elon.FileNoExistException at com.elon.StaruptService.throwException(StaruptService.java:21)
    at com.elon.StaruptService.main(StaruptService.java:9)

    方案

    提供一个静态公有方法用于获取异常的堆栈信息。将堆栈作为异常信息的一部分输出到日志文件或者打印到控制台界面。

    步骤一:创建一个Demo项目


    这里写图片描述

    步骤二:编写样例代码

    1、获取异常堆栈的公共方法:

    package com.elon;
    
    import java.io.PrintWriter;
    import java.io.StringWriter;
    
    public class UtilTool
    {
        /**
         * 获取异常的调用堆栈信息。
         * 
         * @return 调用堆栈
         */
        public static String toStackTrace(Exception e)
        {
            StringWriter sw = new StringWriter();
            PrintWriter pw = new PrintWriter(sw);
    
            try
            {
                e.printStackTrace(pw);
                return sw.toString();
            }
            catch(Exception e1)
            {
                return "";
            }
        }
    }
    
    2、增加一个判断文件不存在时抛出的异常:
    
    package com.elon;
    
    /**
     * 自定义的文件不存在异常。
     *
     * @author elon
     */
    public class FileNoExistException extends Exception
    {
        private static final long serialVersionUID = 7929453457697405891L;
    
        /**
         * 文件完整路径
         */
        private String filePath;
    
        /**
         * 构造函数。初始化文件路径。
         * 
         * @param filePath 文件路径
         */
        public FileNoExistException(String filePath)
        {
            this.filePath = filePath;
        }
    
        public String getExceptionMsg()
        {
            return "filePath:" + filePath + "|exception trace:" + UtilTool.toStackTrace(this);
        }
    }
    
    3、打印异常信息:
    
    public class StaruptService
    {
        public static void main(String[] args)
        {
            try
            {
                FileNoExistException e = throwException();
            } 
            catch (FileNoExistException e)
            {
                System.out.println(e.getExceptionMsg());
            }
        }
    
        private static FileNoExistException throwException() throws FileNoExistException
        {
            throw new FileNoExistException("D:/123.xlsx");
        }
    }

    测试打印结果

    filePath:D:/123.xlsx|exception trace:com.elon.FileNoExistException at com.elon.StaruptService.throwException(StaruptService.java:19)
    at com.elon.StaruptService.main(StaruptService.java:9)
    展开全文
  • 第一种报异常时要throw new RuntimeException("异常"),只能得到异常2字. 第二种e.printStackTrace();只是打印,不返回任何数据. 而服务器一般是集群或其他方式部署,查看日志的话太麻烦,可以吧堆栈信息转成...

    平时使用e.getMessage()或e.printStackTrace();

    第一种报异常时要throw new RuntimeException("异常"),只能得到异常2字.

    第二种e.printStackTrace();只是打印,不返回任何数据.

    而服务器一般是集群或其他方式部署,查看日志的话太麻烦,可以吧堆栈信息转成String等类型,然后进行保存到数据库、放在页面隐藏域中方便查看.

    介绍3种方法供选择:

    方法一:

    package name.xu;public class CallStack {    public static void printCallStatck() {
            Throwable ex = new Throwable();
            StackTraceElement[] stackElements = ex.getStackTrace();        
            if (stackElements != null) {            
                for (int i = 0; i < stackElements.length; i++) {
                    System.out.print(stackElements[i].getClassName()+"/t");
                    System.out.print(stackElements[i].getFileName()+"/t");
                    System.out.print(stackElements[i].getLineNumber()+"/t");
                    System.out.println(stackElements[i].getMethodName());
                    System.out.println("-----------------------------------");
                }
            }
        }
        
    }

     

    方法二:

    Exception e = new Exception("this is a log");
    e.printStackTrace();

     

    方法三:

    String fullStackTrace = org.apache.commons.lang.exception.ExceptionUtils.getFullStackTrace(e)

     

    方法四:

    Thread.currentThread().getStackTrace()

    转载于:https://my.oschina.net/zjllovecode/blog/1927568

    展开全文
  • 其中,在日志中打印异常堆栈信息对于定位问题极为重要,因此,作为一名工程师,对打印异常堆栈应该不陌生。笔者在实践中曾遇到一个奇怪的现象: Java 应用运行中,当发生 NullPointerException,ArithmeticException...

    在应用程序的开发和维护中,通常需要借助运行日志来监控和定位问题。其中,在日志中打印异常堆栈信息对于定位问题极为重要,因此,作为一名工程师,对打印异常堆栈应该不陌生。笔者在实践中曾遇到一个奇怪的现象: Java 应用运行中,当发生 NullPointerException,ArithmeticException,ArrayStoreException,ClassCastException,ArrayIndexOutOfBoundsException 这几种异常时,异常的堆栈信息有时会莫名其妙地“丢失”。

    以 NullPointerException 为例,正常情况下异常堆栈信息如下所示:

    java.lang.NullPointerException    at com.exception.test.core.TestNullPointerException.exceptionTest(TestNullPointerException.java:28)    at com.exception.test.core.TestNullPointerException.main(TestNullPointerException.java:15)

    基于上述堆栈,工程师可以迅速地定位问题。然而,有时异常的堆栈会“丢失”,仅能打印出异常的名字,如下所示:

    java.lang.NullPointerException

    如此简略的异常信息对于定位问题几乎没有意义,那么,究竟是什么原因导致这种现象出现的呢?要弄清其中缘由,还得从 Java 语言的编译、执行及优化原理谈起,本场 Chat 将为读者详细解答。本场 Chat 主要内容如下:

    • 现场还原:Java 异常堆栈丢失问题;
    • Java 语言的执行原理;
    • JIT 编译原理;
    • JVM 如何确定热点代码;
    • Java 8 后时代;
    • 源码解读:Java 异常堆栈丢失的根因
    • 总结

    阅读全文: http://gitbook.cn/gitchat/activity/5e062db090081c1ddb06cbe0

    您还可以下载 CSDN 旗下精品原创内容社区 GitChat App ,阅读更多 GitChat 专享技术内容哦。

    FtooAtPSkEJwnW-9xkCLqSTRpBKX

    展开全文
  • 举例:写一个空指针异常 1:声明一个引用类型,并且赋值为null 2:使用这个null变量调用方法或者属性,都会产生空指针异常 注意:异常信息,是JVM给程序跑出来的,我们程序员加try…catch…,是为了是代码能正常的...
    • 举例:写一个空指针异常
      1:声明一个引用类型,并且赋值为null
      2:使用这个null变量调用方法或者属性,都会产生空指针异常

    • 注意:异常信息,是JVM给程序跑出来的,我们程序员加try…catch…,是为了是代码能正常的执行下去

    • 注意:如果你知道你的代码有可能报什么异常,那么就在catch中写一个具体的异常类型

    • 注意:如果你自己写的异常没有和代码抛出的异常匹配,那么他就不会进到catch中,导致的结果及时,后面的代码也不能执行了

    • 注意:如果你不知道的你的代码会报什么异常,那么干脆直接写Exception异常,记着在catch中吧打印异常信息的代码加上,便于程序员寻找错误原因

    • 注意:如果有多个方法调用,其中一个方法出错了,异常会报好几个地方,我们找异常的时候,从控制台的由上而下来找

    • 注意:方法连续调用,在堆栈异常数组中,你有几个方法,就有几条跟踪信息,一般数组中的第一个是它具体异常信息

    • 异常堆栈信息
      e.printStackTrace()
      java.lang.NullPointerException
      at com.sxt.day1217.exception1.Demo2.main(Demo2.java:18)
      StackTraceElement[] 异常堆栈元素数组

    String eName = e.getClass().getName(); //代表异常类名
    String cName = el.getClassName(); //异常发生的java类的名字
    String fName = el.getFileName(); //异常发生的java文件的名字
    String mName = el.getMethodName(); //异常发生的方法名
    int lineNum = el.getLineNumber();//异常发生的行数
    String msg = e.getMessage();//异常原因

    public class Demo2 {
        public static void c(){
    
     a();
        }
    
    
    
     public static void a(){
        	//int[] arr =null;
        	
         try {
        	
    		System.out.println(10/0);
    		//NullPointerException
    	} catch (Exception e) {
    		StackTraceElement[] ste = e.getStackTrace();//
    		System.out.println(ste.length);
    		StackTraceElement el = ste[0];
    		String eName = e.getClass().getName(); //代表异常类名
    		String cName = el.getClassName(); //异常发生的java类的名字
    		String fName = el.getFileName();  //异常发生的java文件的名字
    		String mName = el.getMethodName(); //异常发生的方法名
    		int lineNum = el.getLineNumber();//异常发生的行数
    		String msg = e.getMessage();//异常原因
    		
    		System.err.println(eName+" :"+msg+"\n\tat "+cName+"."
    						+mName+"("+fName+lineNum+")");
    		
    		//System.out.println(ste.length);
    		//String mes = e.getMessage();//异常原因
    		//System.err.println(mes);
    		e.printStackTrace();
    	}
    	
    	System.out.println("我可以执行吗?");
    }
    
    public static void main(String[] args) {
      c();	
    }
    }
    
    展开全文
  • Java异常堆栈打印的最佳实践方式

    千次阅读 2019-02-15 11:21:03
    对于异常的处理,最佳的实践是每一层都把异常catch住,然后每一层都往上抛,最后在最表层把堆栈信息打印出来。记住不需要每一次层都去打印堆栈。因为每一层打印的话大家的堆栈有效信息其实是一样的。最佳的方式是在...
  • Java异常堆栈的查看方法

    千次阅读 2017-08-15 00:40:29
    这篇文章主要记录下我遇到异常堆栈信息时的思路。JavaSe中没有用专门Log类捕获的异常如下代码所示:public class TestException { public static void main(String[] args) { new TestException
  • Java异常堆栈字符串输出 public class ExceptionTrans { /** * 异常信息转换为字符串 * * @param t 异常对象 * @return */ public static String ex2String(Throwable t) { StringWriter sw = new...
  • JAVA异常堆栈信息被吃掉的原因

    千次阅读 2019-07-06 12:17:55
    线上dubbo请求,报空指针,但是没有具体堆栈信息,无法找到报错的源头 任务 首先找出源头解决燃眉之急,加try catch 块,一步一步缩小范围,最终发现是 map的getOrDefault()方法的一个参数是a->null类型的参数...
  • java异常堆栈信息丢失

    2016-10-08 14:30:00
    在生产环境上看到tomcat/log/gate.log一直输出异常信息,但是不见异常堆栈信息。 Java .lang.NullPointerException java.lang.NullPointerException java.lang.NullPointerException java.lang....
  • 打印java异常堆栈信息到日志文件

    千次阅读 2015-05-26 10:08:09
    存在问题:e.printStackTrace();无法直接将堆栈信息,打印到日志文件。 解决办法: ... * @功能说明:在日志文件中,打印异常堆栈 * @param Throwable * @return:String */ public static String Log
  • 其中,在日志中打印异常堆栈信息对于定位问题极为重要,因此,作为一名工程师,对打印异常堆栈应该不陌生。笔者在实践中曾遇到一个奇怪的问题,NPE(NullPointerException) 的堆栈有时候能打印出来,有时却只能打印了...
  • Java语言的异常类Exception包含着异常的全部信息。 现设异常的实例名为ex,所有的异常都是一个除以0的表达式(int i...3、通过ex.printStackTrace()可以直接在控制台打印异常的全部信息(包括堆栈),但该函数最好不要
  • StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); e.printStackTrace(pw); return sw.toString()
  • 测试开发,面试中会问到如何...Java中,所有异常都继承自Throwable类(一个完整可用的类)。 整体上分为Error、Exception两个大类, Exception大类又分为UncheckedException(继承于RuntimeException)和CheckedE...
  • 主要给大家介绍了关于Java如何自定义异常打印非堆栈信息的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
  • Java抛出得异常堆栈信息的查看方法

    千次阅读 2019-05-09 16:44:50
    Java抛出得异常堆栈信息的查看方法: 概述 相信很多初学者都很怕eclipse下满篇通红的异常信息,其实这些异常信息是定位代码问题最好的方法。这篇文章主要记录下我遇到异常堆栈信息时的思路。 JavaSe中没有用...
  • 异常堆栈作为我们平时定位问题的最重要手段,为我们解决问题提供了很大帮助。但是我们可能都有这样的习惯就是看到一段异常,尤其是异常堆栈很多,层次很深的时候。就感觉很担心害怕,匆匆扫描一眼就开始猜问题应该...
  • Java获取异常堆栈信息

    2019-07-27 00:04:00
    * 只能获取单层异常信息 无法获取caused by * */ public String getExceptionStack(Throwable e){ StackTraceElement[] stackTraceElements = e.getStackTrace(); String prefix = "E...
  • java异常堆栈信息过滤

    千次阅读 2013-01-07 23:56:04
    java代码中捕获异常后可以简单通过ex.printStackTrace()打印出异常堆栈跟踪信息。但实际应用中经常需要通过log4j将日志打印到日志文件中,若直接使用ex.printStackTrace()会在每行堆栈信息前后加入log4j的格式,既...
  • 当我们使用try..catch方法(如下图所示)捕获到异常堆栈信息时,有时候无法打印出具体的错误信息到日志文件,即无法通过抛出的异常迅速定位到问题所在。因此我们需要将异常堆栈信息通过某种方法解析出来,输出完整...
  • java不打印异常堆栈

    千次阅读 2019-06-13 12:57:45
    生产环境抛异常,但却没有将堆栈信息输出到日志,只有简单的java.lang.NullPointerException错误信息。 原因分析 JVM在默认启动的时候会加上OmitStackTraceInFastThrow参数,含义是当大量抛出同样的异常的后,后面的...
  • 版权声明:本文为博主原创文章,未经博主允许不得转载[http://blog.csdn.net/doctor_who2004]。... SLF4J 1.6.0 以前的版本,如果打印异常堆栈信息,必须用 log.error(String msg, Throwable t) log...
  • 异常堆栈作为我们平时定位问题的最重要手段,为我们解决问题提供了很大帮助。但是我们可能都有这样的习惯就是看到一段异常,尤其是异常堆栈很多,层次很深的时候,我们就感觉很担心害怕,匆匆扫描一眼就开始猜问题...
  • ​在Java开发中,我们经常要处理各种异常,我们一般用e.toString()或e.getMessage()得到异常信息,但是有时候异常堆栈中会存在很多信息。下边代码就是个工具方法,可以直接获取堆栈中的异常信息。 代码如下: ...
  • java异常堆栈转换为字符串

    千次阅读 2014-07-03 20:46:56
    java异常提供了printStackTrace方法,但是没有办法直接将对转转换为字符串,通过下面的类可以方便的实现:
  • 在做需求开发的时候,碰到一个需求:某个操作可能会失败(因为数据或其他原因导致了异常),后台只是捕获了异常,然后笼统的提示该操作失败。但是这样不能从页面直接看到异常原因,由于这个功能是我们公司自己的人员...
  • java获取完整异常信息(堆栈信息)

    千次阅读 2020-07-07 12:35:21
    一般用e.toString()或e.getMessage()得到异常信息,但是有时候异常堆栈中会存在很多信息都是很有用的。 /** * 获取堆栈信息 * @param throwable * @return */ public static String getStackTrace(Throwable ...
  • 主要介绍了浅谈log4j 不打印异常堆栈,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 93,341
精华内容 37,336
关键字:

java异常堆栈

java 订阅