文档章节

java异常处理01

ideal_github_harbby
 ideal_github_harbby
发布于 01/29 16:52
字数 1599
阅读 575
收藏 14

java异常处理高级技巧

什么是Java异常?

当Java程序的正常行为被意外行为中断时,会发生故障。这种故障被称为异常。例如,程序尝试打开文件以读取其内容,但该文件不存在将产生异常。Java将异常分为几种类型,所以让我们考虑每一种类型。

检查异常

Java将(例如FileNotFoundException, IOException)引起的异常分类为已检查的异常。Java编译器会检查这些异常,并且在异常发生的位置要求进行捕获处理或者向上抛出(throws)。需要注意的是检查异常属于编译器的行为,要求你必须在代码中捕获或向上抛出(throws)

运行时(非检查)异常

例如程序进行强制转换(cast),这种可能存在转换失败的异常就是另一种异常。即运行时异常(RuntimeException)。和检查不同,编译器不会检查你在代码中是否进行处理或抛出。运行时异常通常来自编写的不良代码,因此应由程序员修复。

错误(Error)

指一些非常严重,通常无法进行修正必须要重启程序的异常。例如, 尝试从JVM分配内存,但没有足够的可用内存来满足请求(OutOfMemoryError)。运行时尝试调用加载类文件但类文件但无法找到时(NoClassDefFoundError)。对于错误您永远不应该尝试捕获并自己处理错误,因为JVM可能已经无法从中恢复正常

Throwable及其子类

Java提供了表示不同类型异常的类层次结构。java.lang包的Throwable类是所有异常类的超类。

/
└────Throwable
     ├────Error
     │    ├────NoClassDefFoundError
     │    └────OutOfMemoryError
     └────Exception
          ├────RuntimeException
          │    ├────IllegalArgumentException
          │    └────NullPointerException
          ├────FileNotFoundException
          └────IOException
 (注: 该图使用https://github.com/harbby/gadtry Graph功能绘制)

注意:通常您不应该以任何方式捕获和处理Throwable

Exception类

Throwable有两个直接的子类。其中一个子类是Exception。Java提供了许多直接子类的异常类Exception。比如:

  • SQLException 表示发生了jdbc异常,来自java.sql包中

  • IOException 表示发生了I/O异常,来自java.io包中

注意,每个Exception子类名称都以Exception单词结尾。该约定使得易于识别该类异常。

您可能想自定义使用自己的Exception检查异常。下面自定义示例:

public class MyException extends Exception
{
    public MyException(String message)
    {
        super(message);
    }

    public MyException(String message, Throwable cause)
    {
        super(message, cause);
    }

    public MyException(Throwable cause)
    {
        super(cause);
    }
}

Error类

Throwable另一个直接的子类是Error,描述了一个合理的应用程序不应该尝试处理的严重问题 - 例如内存不足溢出,栈溢出,或者尝试加载无法找到的类。例如:

  • OutOfMemoryError 内存溢出
  • StackOverflowError 栈溢出
  • NoClassDefFoundError 尝试加载无法找到的类时触发

注意:通常您不应该以任何方式捕获和处理Error类异常

RuntimeException类

RuntimeException异常或其子类实例化是未经检查的异常。直接父类是Exception。RuntimeException和其分类Exception 声明相同的构造函数(具有相同的参数列表)。它通常表示一个可能由不良代码引起的运行时异常。下面是它的一些示例:

  • NullPointerException 空指针异常,java最常见异常。过多的该异常通常意味您需要提高代码编写技巧。
  • IllegalArgumentException 验证异常,通常表示参数非法或不正确的状态。
  • ClassCastException 类型转换异常

NullPointerException异常优化:

  1. 尝试使用java.util.Optional<T>作为方法返回值,使用Optional.empty()取代return null
  2. 使用将字符串放在前面 "str".equals(arg)
  3. 做好方法或构造函数的入参检查。this.args = Objects.requireNonNull(inArgs, "inArgs is null");
  4. 返回空集合而不是null。return new String[0] or return Collections.emptyMap()
  5. 方法入参和返回使用 long,int 而非包装类 Intger,Long

异常抛出

C语言通常return全局错误变量来通常调用者。而java则使用抛出异常对象来通知调用者。了解如何以及何时抛出异常是Java编程一个非常重要技能。通常您只抛出ExceptionRuntimeException的子类实例化的对象。抛出异常有两个步骤。

  1. 使用throw new 异常语句抛出异常对象。
  2. 在方法上使用throws 异常语句告知编译器(对于检查异常这是必须的)。

throw抛出异常:

throw new SQLException();
throw new FileNotFoundException("not find file " + fileName);

异常抛出是指将异常对象从当前方法抛出到JVM。然后JVM会在异常表中查找合适异常处理逻辑(catch)。如何没有找到则JVM会退出当前方法的调用栈,从上级调用者(方法)的异常表中继续寻找。如果找到它将使用该处理代码进行处理异常。如果JVM最后在main()方法的异常表中依然没有找到合适处理逻辑(catch)那么JVM将会发出消息-1然后退出。

注意: 异常处理通常非常昂贵,您不该在任何时候使用异常处理逻辑来处理您的正常业务

throws告知编译器:

从方法中抛出检查异常时,需要在方法上添加抛出标志来通知编译器。

public static void main(String[] args) throws SQLException {}

总结

该篇文档总结java异常的分类和各自的特点。下面是一些关键点总结:

  • 强制你处理或抛出检查异常属于编译器的行为,对于它编译器要求你必须在代码中捕获或向上抛出(throws)。

  • 永远不要试图catch Error错误尝试捕获并自己处理错误,因为JVM可能已经无法从中恢复正常。

  • 永远不要以任何方式直接catch捕获和处理Throwable, 因为Error是它子类。

  • 异常处理通常代价非常昂贵,不要试图用来处理您的正常业务。

  • 过多的NullPointerException异常意味着你需要提高代码编写技巧。

© 著作权归作者所有

共有 人打赏支持
ideal_github_harbby
粉丝 6
博文 6
码字总数 8605
作品 2
成都
私信 提问
加载中

评论(2)

ideal_github_harbby
ideal_github_harbby

引用来自“天下无双黑猫先生”的评论

异常处理简单,什么时候处理,怎么处理才是重点🌚
且等下文哈
天下无双黑猫先生
天下无双黑猫先生
异常处理简单,什么时候处理,怎么处理才是重点🌚
Fundebug后端Java异常监控插件更新至0.2.0,支持Spring及Maven

摘要: 0.2.0支持监控Spring应用,并且支持使用Maven接入插件,请大家及时更新。 支持监控Spring应用 1. pom.xml配置fundebug-spring(https://mvnrepository.com/artifact/com.fundebug/fun...

Fundebug
01/08
0
0
Hasor v0.0.6 发布,轻量级 Java 开发框架又添新成员

Hasor是一款开源的 Java 应用开发框架。它是围绕 Guice 为核心创建的一系列模块组合而成。使用Hasor 会加快软件软件开发效率,并降低开发成本。Hasor 的本质与Struts , Hibernate等单层框架不...

哈库纳
2013/12/21
1K
6
从java1到java9每个版本都有什么新特性?

每次出新版本,大家大概都会这么问,“Java X会有什么特性呢?” 。在下面的内容里,我总结了至今为止的Java主要发行版中各自引入的新特性,这样做的目的是为了突出各个新特性是在哪个发行版...

Java红茶
2017/11/12
0
0
Fundebug后端Java插件更新至0.2.0,支持Spring及Maven

Fundebug后端Java插件更新至0.2.0,支持Spring及Maven 摘要: 0.2.0支持监控Spring应用,并且支持使用Maven接入插件,请大家及时更新。 支持监控Spring应用 1. pom.xml配置fundebug-spring依...

Fundebug
01/08
0
0
java.sql.SQLException: Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp

版权声明:本文为 testcsdn(微wx笑) 原创文章,非商用自由转载-保持署名-注明出处,谢谢。 https://blog.csdn.net/testcsdn/article/details/50015665 详细错误信息:...

微wx笑
2015/11/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

php __call,__callStatic

// demo1.php<?phpclass test{public function run(){static::who();test::who();self::who(); $this->who();}public static function __callS...

小张525
32分钟前
1
0
Java发展历史

1995年5月23日,Java语言诞生 1996年1月,第一个JDK-JDK1.0诞生 1996年4月,10个最主要的操作系统供应商申明将在其产品中嵌入JAVA技术 1996年9月,约8.3万个网页应用了JAVA技术来制作 1997年...

二九结狐六体
33分钟前
2
0
蚂蚁金服核心技术:百亿特征实时推荐算法揭秘

摘要: 文章提出一整套创新算法与架构,通过对TensorFlow底层的弹性改造,解决了在线学习的弹性特征伸缩和稳定性问题,并以GroupLasso和特征在线频次过滤等自研算法优化了模型稀疏性。在支付...

阿里云官方博客
37分钟前
4
0
Dubbo底层采用Socket进行通信详解

Dubbo底层采用Socket进行通信详解 由于Dubbo底层采用Socket进行通信,自己对通信理理论也不是很清楚,所以顺便把通信的知识也学习一下。 n 通信理论 计算机与外界的信息交换称为通信。基本的...

DemonsI
47分钟前
3
0
Sublime Text3快捷键大全

Sublime Text3快捷键大全 选择类 Ctrl+D 选中光标所占的文本,继续操作则会选中下一个相同的文本。 Alt+F3 选中文本按下快捷键,即可一次性选择全部的相同文本进行同时编辑。举个栗子:快速选...

linjin200
52分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部