异常机制(Exception)

什么是异常

  • 实际工作中,遇到的情况不可能是非常完美的。比如:你写的某个模块,用户输入不一定符合你的要求、你的程序要打开某个文件,这个文件可能不存在或者文件格式不对,你要读取数据库的数据,数据可能是空的等问题。我们的程序在跑着时候,内存或者硬盘可能满了。等等。
  • 软件程序在运行过程中,非常可能遇到刚刚提到的这些异常问题,我们叫异常(Exception)。这些例外情况或者叫异常,怎么让我们写的程序做出合理的处理。而不至于程序崩溃。
  • 异常指程序运行中出现的不期而至的各种状况,如:文件找不到、网络连接失败、非法参数等。
  • 异常发生在程序运行期间,他影响了正常的程序执行流程。

异常简单分类

  • 要理解Java异常处理是如何工作的,你需要掌握以下三种类型的异常:
  • **检查性异常:**最具有代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。
  • **运行时异常:**运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。
  • **错误ERROR:**错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如当栈溢出时,一个错误就发生了,它们在编译也检查不到的。

异常体系结构

  • Java把异常当做对象来处理,并定义一个基类java.lang.Throwble作为所有异常的超类。
  • 在Java API中已经定义了许多异常类,这些异常类分为两大类,错误Error和异常Exception。

  • Exception的直接子类:编译时异常(要求程序员在编写程序阶段必须预先对这些异常进行处理,如果不处理编译器报错,因此得名编译时异常。)。
  • RuntimeException:运行时异常。(在编写程序阶段程序员可以预先处理,也可以不管,都行。)

Error

Error类对象由Java虚拟机生成并抛出,大多数错误与代码编写者所执行的操作无关。

  • Java虚拟机运行错误(Virtual MacguneError),当JVM不再有继续执行操作所需要的内存资源时,将出现OutOfMemoryError。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止.
  • 还有发生在虚拟机试图执行应用时,如类定义错误(NoClassDefFoundError)、链接错误(LinkageError)。这些错误是不可查的,因为它们在应用程序的控制和处理能力之外,而且绝大多数是程序运行时不允许出现的状况。

Exception

在Exception分支中有一个重要的子类RuntimeException(运行时异常)

  • ArrayIndexOutOfBoundsException(数组下标越界)
  • NullPointerException(空指针异常)
  • ArithmeticException(算术异常)
  • MissingResourceException(丢失资源)
  • ClassNotFoundException(找不到类)等异常,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理

这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常 的发生

Error与Exception的区别

Error通常是灾难性的致命的错误,是程序无法控制和处理的,当出现这些异常时,Java虚拟机(JVM)一般会选择终止线程;

Exception通常情况下是可以被程序处理的,并且程序中应该尽可能的去处理这些异常.

异常处理机制

  • 抛出异常
  • 捕获异常

异常处理五个关键字:

try 、catch、finally、throw、throws

实例:

package com.exception;public class Test {public static void main(String[] args) {//假设要捕获多个异常:从小到大!int a = 1;int b = 0;try {//try监控区域if (b==0){//主动抛出异常  throw throwsthrow new ArithmeticException();//主动抛出异常}System.out.println(a/b);}catch (Error e){//catch(想要捕获的异常类型!)捕获异常System.out.println("程序出现异常,变量b不能为0");}catch (Exception e){System.out.println("Exception");}catch (Throwable t){System.out.println("Throwable");}finally {//处理善后工作System.out.println("finally");}//finally可以不要    finally 用于 假设IO,资源,关闭!}public void a(){b();}public void b(){a();}
}
}

捕获多个异常需要从小到大去捕获(大小可看异常体系结构)

快捷键ctrl+alt+t 生成try catch finally

finally 可以不要finally,假设IO,资源,关闭

异常主动抛出

public class Test2 {public static void main(String[] args) {new Test2().test(1,0);}//假设这个方法中,处理不了这个异常,方法上抛出异常public void test(int a,int b)throws ArithmeticException{if (b==0) {// throw     throwsthrow new ArithmeticException();//主动抛出异常,一般在方法中使用,}}
}

主动在方法中抛出用throw 在方法上用throws

public class ExceptionTest03 {public static void main(String[] args) {System.out.println(100 / 0);// 这里的HelloWorld没有输出,没有执行。System.out.println("Hello World!");}
}

程序执行到System.out.println(100 / 0);
此处发生了 ArithmeticException 异常,底层 new 了一个ArithmeticException异常对象,然后抛出了。
由于是 main方法 调用了100 / 0,所以这个异常ArithmeticException抛给了main方法。
main方法没有处理,将这个异常自动抛给了 JVM。JVM最终终止程序的执行。

此时System.out.println(“Hello World!”);并不会执行。

注意:
ArithmeticException 继承 RuntimeException,属于 运行时异常。在编写程序阶段不需要对这种异常进行预先的处理

自定义异常

使用Java内置的异常类可以描述在编程时出现的大部分异常情况。除此之外,用户还可以自定义异常,用户自定义异常类,只需要继承Exception类即可

  • 在程序中使用自定义异常,大体可以分为以下几个步骤:

    1. 创建自定义异常类。
    2. 在方法中通过throw关键字抛出异常。
    3. 如果在当前抛出异常的方法中处理异常,可以使用try—catch语句捕获并处理;否则在方法的声明处通过throws关键字指明要抛出给方法调用者的异常,继续进行下一步操作。
    4. 在出现异常方法的调用者中捕获并发现异常。

实例:

package com.exception.Demo01;//自定义异常类
public class MyException extends Exception {//传递数字>10,抛出异常private  int detail;public MyException(int detail) {this.detail = detail;}//toString  :异常的打印信息@Overridepublic String toString() {return "MyException{" + detail + '}';}}

测试类:

package com.exception.Demo01;public class Test {static void test(int a) throws MyException {System.out.println("传递的参数:"+a);if (a>10){throw new MyException(a);//抛出}System.out.println("OK");}public static void main(String[] args) {try {test(11);} catch (MyException e) {System.out.println("MyException> "+e);}}
}运行结果:
传递的参数:11
MyException> MyException{11}

实际应用中的经验总结

  • 处理运行时异常时,采用逻辑去合理规避同时辅助try—catch处理
  • 在多重catch块后面,可以采用catch(Exception)来处理可能会被遗漏的异常
  • 对不确定的代码,也可以加上try—catch,处理潜在的异常
  • 尽量去处理异常,切记只是简单地调用printStackTrace()去打印输出
  • 具体如何处理异常,要根据不同的业务需求和异常类型去决定
  • 尽量添加finally语句块 去释放占用的资源

Java异常学习小结相关推荐

  1. Java异常学习心得

    2019独角兽企业重金招聘Python工程师标准>>> Java异常学习心得             本文重在Java中异常机制的一些概念.写本文的目的在于方便我很长时间后若是忘了这 ...

  2. 2.Java异常学习

    1.Java异常的概念 异常的例子 1.除法就是一个需要捕获异常的例子,除数又可能是0 异常处理的基本流程如下 一旦发生异常,就使得程序不按照原来的流程继续的运行下去 a.程序抛出异常 try{ th ...

  3. JAVA多线程学习小结

    一.线程概念:线程是比进程更小的执行单元.一个进程中可以有多个线程 二.多线程优点:提高了程序的执行效率.充分利用资源.使程序同步执行(Java的垃圾回收机制运用了多线程.) 三.进程与线程的区别 线 ...

  4. Java速成学习小结

    目录 关于Java ​​​​​​​Java安装 Java基本语法 主函数 注释 基本数据类型 声明变量: final 关键字: 数组: 两类循环: 尾巴有话说 关于Java Java是一种广泛被使用的 ...

  5. 深入浅出详细介绍Java异常,让你茅塞顿开般的感觉

    零基础学习之Java异常 概述 基本介绍 Error 代码示例 Exception 代码示例 异常的处理 throw 代码示例 throws 代码示例 try-catch 代码示例 finally块 ...

  6. 【学习笔记】【Design idea】一、Java异常的设计思想、性能相关、笔记

    1.前言: 异常.本该是多么优雅的东西,然而,得全靠自己在零散的信息中汇集. 学习笔记保持更新. 2.教材(参考资料) 其他 ①受检异常与非受检异常:https://www.cnblogs.com/j ...

  7. 201671010130 2016-2017-2 《Java程序设计》第五周学习小结

    第五周学习小结 本周的课堂通过老师的讲解,我觉得自己在看书时的疑惑(比如子类如果不需要用到父类的某个方法怎么解决呢?),通过老师的讲解首先是绝对不能在子类中直接删除其方法的,但是可以通过覆盖的方法将其 ...

  8. 写给大忙人的ELK最新版6.2.4学习笔记-Logstash和Filebeat解析(java异常堆栈下多行日志配置支持)

    写给大忙人的ELK最新版6.2.4学习笔记-Logstash和Filebeat解析(java异常堆栈下多行日志配置支持) 参考文章: (1)写给大忙人的ELK最新版6.2.4学习笔记-Logstash ...

  9. 实训小结---Java框架学习心得

    学习小结 为期两个星期的实训结束了,在这两周的时间里,我学到了不少之前没有接触过的知识,这也是我第一次正式接触前端后端的开发.在学习开发的过程中,出现过不少问题,自己能够解决的.自己不能解决的都有,下 ...

最新文章

  1. android悬浮动态权限,android应用内悬浮窗-自动贴边,不需要权限!
  2. 缓存核心知识小抄,面试必备,赶紧收藏!
  3. 【Windows 逆向】OD 调试器工具 ( CE 中获取子弹动态地址前置操作 | OD 中调试指定地址的数据 )
  4. pandas模块学习
  5. hdu 1880 魔咒词典
  6. cognos java api_Cognos API Connection
  7. 计算机进去pe怎么设置用户,电脑密码怎么设置,教您设置电脑开机密码
  8. 华为P50系列相机全球首发新技术:告别偏色做到真实原色捕捉
  9. vue比php的优势,vue.js的优势是什么
  10. errMsg: “getUserProfile:fail can only be invoked by user TAP gesture.
  11. 二十款漂亮CSS字体样式
  12. Docker 基础 (一)
  13. nlp-生成任务-摘要生成
  14. 区别网络带宽中的Kbps和KB/s是什么意思?
  15. java 元祖_JAVA里的元祖类
  16. ABAP EWM模拟 /SCWM/ADGI过账更改HU数量
  17. docker安装mysql远程不能访问_虚拟机中docker安装mysql远程无法访问
  18. 上班工资低,想换行业,这5个冷门职业不错,竞争小,有前途
  19. 易语言miniblink交互教程——第三课 易语言与 Miniblink 交互
  20. “卷积神经网络(Convolutional Neural Network,CNN)”之问

热门文章

  1. Oracle项目管理系统之任务督办及收发文
  2. ubuntu14.04 64位安装H3C iNode客户端
  3. templets/default/index.htm Not Found! 图文教程 织梦程序的安装方法
  4. 按某一列统计重复数据,并获取对应行数据
  5. 查询oracle原始表d,oracle 多表查询
  6. phpcms上传图片去除水印
  7. 已安装visual studio 如何添加新模板和组件
  8. 小甲鱼零基础学习python_19 【pickle -- 腌制一缸泡菜】
  9. 15 个边玩游戏边学编程的网站
  10. A new deep transfer learning network based on convolutional auto-encoder for mechanical fault diagno