Java异常打印输出中常见方法的分析
来源:互联网 发布:分水岭算法的原理 编辑:程序博客网 时间:2024/06/15 00:05
Java异常是在Java应用中的警报器,在出现异常的情况下,可以帮助我们程序猿们快速定位问题的类型以及位置。但是一般在我们的项目中,由于经验阅历等多方面的原因,依然有若干的童鞋在代码中没有正确的使用异常打印方法,导致在项目的后台日志中,没有收到日志或者日志信息不完整等情况的发生,这些都给项目埋下了若干隐患。本文将深入分析在异常日志打印过程中的若干情况,并给出若干的使用建议。
1. Java异常Exception的结构分析
我们通常所说的Exception主要是继承于Throwable而来,可以参见如下的结构图示:
Java异常打印输出中常见方法的分析
主要的Throwable分为异常和错误两种,然后异常Exception和错误Error做为基类,分别被具体个性化以及衍生出NullPointerException、EOFException等等异常信息类。
基于Java中的源代码来分析,Error和Exception仅仅是继承了Throwable,做了构造函数的拓展,没有进行额外方法的延展;Exception输出的主要核心方法都是定义在Throwable中的,感兴趣的童鞋可以尝试阅读JDK的源代码。
Java异常打印输出中常见方法的分析
下面将介绍一下关键的几个异常类方法:
getMessage(): String
输出异常的描述信息
getLocalizedMessage()
输出本地化的描述信息,一般此方法可被子类所覆盖,缺省实现与getMessage()输出信息一致
printStackTrace()
将异常栈打印到输出流中,此为一类方法,默认打印到console控制台,也可以显式指定输出流。
fillInStackTrace()
将当前的异常栈保存到一个Throwable中,返回这个Throwable。大部分情况下,用在保留异常栈嵌套调用的情况,尝试保留完整的异常栈,无需使用该方法。
2. Error vs Exception
Error在Java体系中定义为不可控制的问题,往往用来描述系统错误或者底层的问题,比如虚拟机错误,例如内存空间不足,方法调用栈溢等。我们以上图中列举出的内存溢出错误(StackOverflowError)为例,它是在JVM层面发生的错误,已经游离于java应用层之外;在应用程序层面是无法进行捕获,且无法从错误中恢复的。一般一旦发了类似问题,一般都是直接宕机,应用停止正常的工作,需要重新启动或者修复问题之后,方可重新正常工作。
Exception一般发生在应用层,即在由项目中的Java代码层面引发的问题,且可以尝试进行捕获,此类问题不会影响到应用程序的正常工作的,即不会导致宕机现象的发生。我们在工作或者代码中常见的都是Exception衍生出来的各类异常。
这里需要强调说明一下,JVM是Java语言的运行环境和平台,但是并不是Java语言体系的一个部分;在JVM平台上,还可以运行Groovy, JPython, JRuby, Closure,Scala等等遵守Java语言规范(JavaLanguage Specification)的编程语言,故我们可以将Error理解为脱离Java应用之外的问题。
3. Exception中的运行时异常(RuntimeException)和受控异常(checked exception)
运行时异常(RuntimeException)是指在运行之时发生的异常,无需显式地进行捕获;如果程序中发生类似的异常,JVM会直接抛出此类异常,并打出响应的异常栈信息。此类异常也通常被称为unchecked exception, 未受控异常。
受控异常(checked Exception)是我们最常见的异常种类,在代码中使用的异常基本上都是此类异常,此类异常会在代码编译阶段由Java编译器进行语法检查,如果未显式进行异常捕获,则会报出相应的编译异常信息。
4. 如何在代码中正确打印异常信息
下面我们将通过一系列的例子来说明上述几个Exception中方法的使用技巧。
Case 1: getMessage()/getLocalizedMessage()
public void testCase1() {
System.out.println("We are going to do something interesting....");
try {
throw new NullPointerException("I am an exception in the code.");
} catch (Exception e) {
System.out.println("We got unexpected:" + e.getMessage());
System.out.println("We got unexpected:" + e.getLocalizedMessage());
}
}
输出结果:
We are going to do testing interesting....
We got unexpected in getMessage==> I am an exception in the code.
We got unexpected in getLocalizedMessage==> I am an exception in the code.
基于结果来分析, 上述两个方法只是将异常对象中的Message打印出来,这些信息对于我们追踪问题和调试帮助有限。
Case 2:e.printStackTrace()
public void testCase2() {
System.out.println("We are going to do something interesting....");
try {
throw new Exception("I am an exception in the code.");
} catch (Exception e) {
e.printStackTrace();
}
1. Java异常Exception的结构分析
我们通常所说的Exception主要是继承于Throwable而来,可以参见如下的结构图示:
Java异常打印输出中常见方法的分析
主要的Throwable分为异常和错误两种,然后异常Exception和错误Error做为基类,分别被具体个性化以及衍生出NullPointerException、EOFException等等异常信息类。
基于Java中的源代码来分析,Error和Exception仅仅是继承了Throwable,做了构造函数的拓展,没有进行额外方法的延展;Exception输出的主要核心方法都是定义在Throwable中的,感兴趣的童鞋可以尝试阅读JDK的源代码。
Java异常打印输出中常见方法的分析
下面将介绍一下关键的几个异常类方法:
getMessage(): String
输出异常的描述信息
getLocalizedMessage()
输出本地化的描述信息,一般此方法可被子类所覆盖,缺省实现与getMessage()输出信息一致
printStackTrace()
将异常栈打印到输出流中,此为一类方法,默认打印到console控制台,也可以显式指定输出流。
fillInStackTrace()
将当前的异常栈保存到一个Throwable中,返回这个Throwable。大部分情况下,用在保留异常栈嵌套调用的情况,尝试保留完整的异常栈,无需使用该方法。
2. Error vs Exception
Error在Java体系中定义为不可控制的问题,往往用来描述系统错误或者底层的问题,比如虚拟机错误,例如内存空间不足,方法调用栈溢等。我们以上图中列举出的内存溢出错误(StackOverflowError)为例,它是在JVM层面发生的错误,已经游离于java应用层之外;在应用程序层面是无法进行捕获,且无法从错误中恢复的。一般一旦发了类似问题,一般都是直接宕机,应用停止正常的工作,需要重新启动或者修复问题之后,方可重新正常工作。
Exception一般发生在应用层,即在由项目中的Java代码层面引发的问题,且可以尝试进行捕获,此类问题不会影响到应用程序的正常工作的,即不会导致宕机现象的发生。我们在工作或者代码中常见的都是Exception衍生出来的各类异常。
这里需要强调说明一下,JVM是Java语言的运行环境和平台,但是并不是Java语言体系的一个部分;在JVM平台上,还可以运行Groovy, JPython, JRuby, Closure,Scala等等遵守Java语言规范(JavaLanguage Specification)的编程语言,故我们可以将Error理解为脱离Java应用之外的问题。
3. Exception中的运行时异常(RuntimeException)和受控异常(checked exception)
运行时异常(RuntimeException)是指在运行之时发生的异常,无需显式地进行捕获;如果程序中发生类似的异常,JVM会直接抛出此类异常,并打出响应的异常栈信息。此类异常也通常被称为unchecked exception, 未受控异常。
受控异常(checked Exception)是我们最常见的异常种类,在代码中使用的异常基本上都是此类异常,此类异常会在代码编译阶段由Java编译器进行语法检查,如果未显式进行异常捕获,则会报出相应的编译异常信息。
4. 如何在代码中正确打印异常信息
下面我们将通过一系列的例子来说明上述几个Exception中方法的使用技巧。
Case 1: getMessage()/getLocalizedMessage()
public void testCase1() {
System.out.println("We are going to do something interesting....");
try {
throw new NullPointerException("I am an exception in the code.");
} catch (Exception e) {
System.out.println("We got unexpected:" + e.getMessage());
System.out.println("We got unexpected:" + e.getLocalizedMessage());
}
}
输出结果:
We are going to do testing interesting....
We got unexpected in getMessage==> I am an exception in the code.
We got unexpected in getLocalizedMessage==> I am an exception in the code.
基于结果来分析, 上述两个方法只是将异常对象中的Message打印出来,这些信息对于我们追踪问题和调试帮助有限。
Case 2:e.printStackTrace()
public void testCase2() {
System.out.println("We are going to do something interesting....");
try {
throw new Exception("I am an exception in the code.");
} catch (Exception e) {
e.printStackTrace();
}
}
宁波假体隆鼻http://www.iyestar.com/bbzx/jtlb/
阅读全文
0 0
- Java异常打印输出中常见方法的分析
- Java异常打印输出中常见方法的分析
- Java中常见的异常分析
- JAVA中常见的三种打印异常的方式
- java中常见异常的分析 (总结)
- java中常见的异常及处理方法
- Java中常见的异常
- Java中常见的异常
- Java中常见的异常
- Java中常见的异常
- Java中常见的异常
- Java中常见的异常
- java中常见的异常
- java中常见的异常
- java中常见的异常
- Java中常见的异常
- java中常见的异常.
- Java中常见的异常
- 集合框架--Map
- 关于distinct 和group by的去重逻辑浅析
- Android中ViewPager常用功能5----MagicIndicator(框架)打造ViewPager指示器
- spring学习之@ModelAttribute运用详解
- HDU
- Java异常打印输出中常见方法的分析
- 正则表达式
- 原生javascript判断是否是移动端访问,跳转到手机端网址代码
- 记录将文档word2007版本转换为html格式——java代码
- Python爬虫爬取知乎用户信息+寻找潜在客户
- 字符串
- 腾讯开源ncnn:自己的模型运行结果与caffe的结果不一样
- 对象的访问定位:句柄与直接指针
- MVC引入SERVICE层 提高代码重用性 沟通CONTROL和MODEL