发现错误的理想时机是程序运行之前(编译期),然后不太现实,很多异常无法被发现(特别是业务上的数据),需要在运行时解决。

  错误恢复机制保证代码健壮性的方式,异常处理在程序中很常见,也是必须的,必须考虑有可能发生的异常,才能保证程序的正常运行。而且

一旦程序出现异常,异常处理及日志能帮助我们定位和解决异常。

概念:

  Exception,是一种意外,不正常的现象。使用异常可以降低处理代码的复杂度,如果不适用异常,就必须通过判断去检查错误,而且可能在很

多地方都要判断,使用异常,只需要在一个地方处理错误,可以节省代码,能够把正常程序运行和异常分开。

异常分为Error和Exception,继承Throwable

1、Error:无法处理的异常,是一种错误,最常见的就是OutOfMemoryError,jvm直接停止运行

2、Exception:一般性的异常,只要能够捕捉处理,就能保证程序正常运行,比如NullPointerException、IndexOutOfBoundsException

Exception又分为:

1、运行时异常RuntimeException:

  我们将RuntimeException或其他继承自RuntimeException的子类称为unchecked Exception。RuntimeException即使不编写异常处理的程序

代码,依然可以编译成功。这种异常在程序运行过程中可能出现,例如NullPointException、ClassCastException等

2、非运行时异常RuntimeException:

  其他继承自Exception异常的子类称为checked Exception,编译器强制要求进行捕获处理,比如常见的IOExeption、SQLException,否则编

译无法通过

如何处理异常?

异常处理方式常用的有两种,分别如下:

1、try、catch、finally

public static void main(String[] args) {try {                                                       //要检查的程序语句int i = 3/0;System.out.println("test");}} catch (ArithmeticException e) {System.out.println("ArithmeticException");} catch (Exception e) {                                               //异常发生时的处理语句System.out.println("Exception Message: " + e.getMessage());throw e;} finally {                                                   //肯定会执行的部分,无论是否发生异常System.out.println("finally Handler");}
}

结果:

ArithmeticException
finally Handler

总结:

  1、finally、catch都是可以省略的

  2、catch可以有多个,如果没有异常,不会执行,发生异常的话,按照顺序匹配,如果匹配,就不会与后面的catch块匹配

  3、finally无论如何都会执行,即使之前有return语句。通常在finally进行资源释放的代码,或者lock的解锁,某些业务场景等

PS:不要在finally使用return,因为会覆盖之前的return语句,很容易造成混淆

  相比throws更加灵活,更好的控制程序流程

2、throw、throws

public int add(int i) throws Exception {if (i == 0) {throw new IllegalArgumentException();}return 0;
}

  throws:是把异常交给jvm进行处理,把异常往上层抛出,一旦发生最终的结果可能就会程序终止(如果上层方法不进行try catch),可以抛出

多个异常,一般需要在上层进行try catch块进行处理。

  throw:用于主动抛出异常,throw关键字可以写在任何地方,通常和业务有关,通常这个异常时自定义和业务相关的Exception类

总结和建议:

1、父类或接口,对于子类是实现类的限制:

  1.1).无论是继承还是实现,父类或者接口没有抛出异常,实现类或子类不能抛出异常

public class A {public void f1()  {}
}
public class B extends A{@Overridepublic void f1() throws IOException{System.out.println("");}
}

  1.2).父类或者接口抛出异常Exception1,实现类或子类可以是否抛出异常都可以,如果抛出Exception2,不能是Exception1的父类

public class A {public void f1()  throws IOException{}
}
public class B extends A{@Overridepublic void f1() throws Exception{System.out.println("");}
}

  1.3).父类的方法抛出异常只有非运行时异常(运行时异常),则子类在重写该方法的时候声明的异常也只能有非运行时异常(运行时异常),

不能含有运行时异常(非运行时异常)。

public class A {public void f1()  throws IOException{}
}
public class B extends A{@Overridepublic void f1() throws IOException,ClassNotFoundException{System.out.println("");}
}

PS:类和接口在这方面的限制是相同的

2、throws一定是具体的Exception,而不是直接抛出Exception,否则上层必须也是抛出Exception,无法定位具体的异常

3、多catch块的异常,一定是小异常在前面,否则可能永远无法捕捉到

4、谨慎使用异常,因为会影响程序性能,能用判断解决还是要判断的

5、不要使用空的catch块

6、异常处理尽量抛到最上层进行统一处理

内容参考:Java异常处理和设计和《Java异常处理》

转载于:https://www.cnblogs.com/huigelaile/p/11015151.html

Java基础(七)--Exception异常处理相关推荐

  1. JAVA基础七 类和对象

    文章目录 JAVA基础七 类和对象 01 引用 02 继承 03 方法重载 04 构造方法 05 this 06 传参 07 包 08 访问修饰符 09 类属性 10 类方法 11 属性初始化 12 ...

  2. Java基础篇:异常处理

    文章目录 异常概述与异常体系结构 常见异常 异常处理机制 异常处理机制一:try-catch-finally 异常处理机制二:throws 手动抛出异常:thow 如何自定义一个异常类? 总结 异常概 ...

  3. java基础(七) 深入解析java四种访问权限

    戳上面的蓝字关注我们哦! 精彩内容 精选java等全套视频教程 精选java电子图书 大数据视频教程精选 java项目练习精选 引言   Java中的访问权限理解起来不难,但完全掌握却不容易,特别是4 ...

  4. 【Java基础知识】 异常处理机制

    "欲渡黄河冰塞川,将登太行雪满山." 系统运行,风云不测,睹始知终,秋去冬来,一叶落而知秋. 1. 什么是异常? 所有使我们程序提前终止,或者没有向预想方向去执行的错误统称为异常. ...

  5. java基础学习总结——异常处理

    概述 顾名思义,通俗来讲异常就是指,那些发生在我们原本考虑和设定的计划之外的意外情况. 生活中总是会存在各种突发情况,如果没有做好准备,就让人措手不及. 你和朋友约好了明天一起去登山,半道上忽然乌云蔽 ...

  6. 复习java基础第二天(异常处理)

    一.常见的异常类型: public class TestException {public static void main(String[] args) {int i = 10;//数学异常: ja ...

  7. [java基础问题] Exception 和 Error

    Exception 和 Error Exception 和 Error 都是继承了 Throwable 类, 在 java 中, 只有继承了 Throwable 类才可以使用 throw 抛出, 或者 ...

  8. Java基础(七): instanceof用法详解

    1.instanceof说明 instanceof 是 Java 的保留关键字. 作用是:测试它左边的对象是否是它右边的类的实例,返回 boolean 的数据类型. instanceof是Java中的 ...

  9. java基础(七) java四种访问权限

    ###引言 Java中的访问权限理解起来不难,但完全掌握却不容易,特别是4种访问权限并不是任何时候都可以使用.下面整理一下,在什么情况下,有哪些访问权限可以允许选择. ###一.访问权限简介 访问权限 ...

最新文章

  1. leetcode 10、Regular Expression Matching
  2. 业务总结001:优惠券与礼包活动
  3. 服务器开发中网络数据分析与故障排查经验
  4. MyEclipse6.5安装SVN插件的方法--在线安装
  5. CSS-伪类选择器(未完待续。。。)
  6. img标签显示不出图片_前端开发,原生 JS 实现最简单的图片懒加载
  7. 洛谷 P1168 中位数(优先队列)
  8. Atitit 图像处理 调用opencv 通过java  api   attilax总结
  9. access建立er图_关于ER图的快速生成 | 学步园
  10. ES RestClient查询文档
  11. android开发经典实战!来自阿里巴巴佛系安卓程序员的指南,专题解析
  12. 【阿里云】短视频SDK产品
  13. js 数组遍历时删除元素方法总结
  14. 渗透测试之文件上传漏洞
  15. identifier of an instance of
  16. 【GANs】Deep Convolution Generative Adversarial Network
  17. 《花开半夏》--4 生死之间的吻(1)
  18. Android(三)原生开发基本知识
  19. Windows Vista With Service Pack 2(x86 / x64)官方简体中文版(ISO)光盘镜像
  20. L3MON搭建(基于云端的远程安卓管理套件)

热门文章

  1. JS Uncaught SyntaxError:Unexpected identifier异常报错原因及其解决方法
  2. 2022-2028年中国汽车天线行业市场需求与投资规划分析报告
  3. 机房收费系统【VB版】——添加和删除用户
  4. LeetCode简单题之好对数的数目
  5. Camera Lens Coating
  6. 活动识别API服务开发
  7. 摄像头ISP系统原理(上)
  8. Python七大原则,24种设计模式
  9. PHP获取今天,昨天,本月,上个月,本年 起始时间戳
  10. Unparseable date: 2015-8-8