在编写程序时,经常要在可能出现错误的地方加上检测的代码,如进行x/y运算时,要检测分母为0,数据为空,输入的不是数据而是字符等。过多的if-else分支会导致程序的代码加长、臃肿,可读性差。因此采用异常处理机制。

Java采用的异常处理机制,是将异常处理的程序代码集中在一起,与正常的程序代码分开,使得程序简洁、优雅,并易于维护。


Java提供的是异常处理的抓抛模型。

Java程序的执行过程中如出现异常,会生成一个异常类对象,该异常对象将被提交给Java运行时系统,这个过程称为抛出(throw)异常。

异常对象的生成抛出:
①由虚拟机自动生成:程序运行过程中,虚拟机检测到程序发生了问题,如果在当
前代码中没有找到相应的处理程序,就会在后台自动创建一个对应异常类的实例
对象并抛出——自动抛出
②由开发人员手动创建:Exception exception = new ClassCastException();——创
建好的异常对象不抛出对程序没有任何影响,和创建一个普通对象一样

如果一个方法内抛出异常,该异常对象会被抛给调用者方法中处理。如果异常没有在调用者方法中处理,它继续被抛给这个调用方法的上层方法。这个过程将一直继续下去,直到异常被处理。这一过程称为捕获(catch)异常。如果一个异常回main()方法,并且main()也不处理,则程序运行终止。


Java异常处理的方式

方式一:try-catch-finally
方式二:throws + 异常类型


通过try-catch-finally(finally可选)方式

try{//可能出现异常的代码
}catch(异常类型1 变量名e){//处理异常的方式1
}catch(异常类型2 变量名e){//处理异常的方式2
}
......
finally{//一定会执行的代码
}

如果明确知道产生的是何种异常,可以用该异常类作为catch的参数;也可以用其父类作为catch的参数。比 如 : 可 以 用 ArithmeticException 类 作 为 参 数 的 地 方 , 就 可 以 用RuntimeException类作为参数,或者用所有异常的父类Exception类作为参数。但不能是与ArithmeticException类无关的异常。NullPointerException(catch中的语句将不会执行)。

使用try将可能出现异常代码包装起来,在执行过程中,一旦出现异常, 就会生成一个对应异常类的对象,根据此对象的类型,去catch中进行匹配。一旦try中的异常对象匹配到某一个catch时, 就进入catch中进行异常的处理。处理完成,就跳出当前的try-catch结构(在没有写finally的情况)。继续执行其后的代码。

catch中的异常类型如果没有子父类关系,则谁声明在上,谁声明在下无所谓。
catch中的异常类型如果存在子父类关系,则要求子类一定声明在父类的上面,否则会报错。

异常对象处理(一般写在catch语句里面,如e.printStackTrace()):
①返回String的getMessage() ,获取异常信息。
②没有返回值的printStackTrace(),获取异常类名和异常信息,以及异常出现在程序中的位置。

在try结构中声明的变量,再出了try结构以后,就不能再被调用。

try-catch-finally结构可以嵌套。

使用try-catch-finally处理编译时异常,是得程序在编译时就不再报错,但是运行时仍可能报错。相当于我们使用try-catch-finally将一个编译时可能出现的异常,延迟到运行时出现。
开发中,由于运行时异常比较常见,所以我们通常不针对运行时异常编写try-catch-finally。而针对于编译时异常,一定要考虑异常的处理。


通过throws方式

"throws 异常类型"写在方法的声明处,指明此方法执行时,可能会抛出的异常类型。一旦当方法体执行时,出现异常,会在异常代码处生成一个异常类的对象,此对象满足throws后写的异常类型时,就会被抛出。异常代码后续的代码不再执行。

public void readFile(String file) throws FileNotFoundException {......// 读文件的操作可能产生FileNotFoundException类型的异常FileInputStream fis = new FileInputStream(file);......
}

try-catch-finally真正地将异常给处理掉了。
throws的方式只是将异常抛给了方法的调用者,并没有真正将异常处理掉。

重写方法不能抛出比被重写方法范围更大的异常类型。在多态的情况下,对methodA()方法的调用-异常的捕获按父类声明的异常处理。

public class A {public void methodA() throws IOException {......}
}
public class B1 extends A {public void methodA() throws FileNotFoundException {......}
}
public class B2 extends A {public void methodA() throws Exception { //报错......}
}

如果父类中被重写的方法没有throws方式处理异常,则子类重写的方法也不能使用throws,意味着如果子类重写的方法中有异常,必须使用try-catch-finally方式处理。


手动抛出(生成创建)异常(throw)

Java异常类对象除在程序执行过程中出现异常时由系统自动生成并抛出,也可根据需要使用人工创建并抛出。

首先要生成异常类对象,然后通过throw语句实现抛出操作(提交给Java运行环境)。例如:

IOException e = new IOException();
throw e;

或者直接

throw new IOException();

用户自定义异常类

一般地,用户自定义异常类都是RuntimeException的子类。
自定义异常类必须继承现有的异常类。
自定义异常类通常需要编写几个重载的构造器。
自定义异常需要提供serialVersionUID。
自定义的异常通过throw抛出。

例子

class MyException extends Exception {static final long serialVersionUID = 13465653435L;private int idnumber;public MyException(String message, int id) {super(message);this.idnumber = id;}public int getId() {return idnumber;}
}
public class MyExpTest {public void regist(int num) throws MyException {if (num < 0)throw new MyException("人数为负值,不合理", 3);elseSystem.out.println("登记人数" + num);}public void manager() {try {regist(100);} catch (MyException e) {System.out.print("登记失败,出错种类" + e.getId());}System.out.print("本次登记操作结束");}
public static void main(String args[]) {MyExpTest t = new MyExpTest();t.manager();}
}

Java异常处理(2)--异常处理机制及自定义异常相关推荐

  1. java 处理异常的场景_Java高级----异常处理机制、自定义异常----含思维导图

    Java高级----异常处理机制.自定义异常----含思维导图 Java高级----异常处理机制.自定义异常----含思维导图 南一Java自学交流QQ群: 586012641 拒绝任何广告,共享Ja ...

  2. 复习Java异常处理_异常分类_自定义异常_线程初步了解

    复习Java异常处理_异常分类_自定义异常_线程 主要内容 异常.线程 教学目标 第一章 异常 1.1 异常概念 异常,就是不正常的意思.在生活中:医生说,你的身体某个部位有异常,该部位和正常相比有点 ...

  3. 【Java面试题】21 Java中的异常处理机制的简单原理和应用。

    [Java面试题]21 Java中的异常处理机制的简单原理和应用. 参考文章: (1)[Java面试题]21 Java中的异常处理机制的简单原理和应用. (2)https://www.cnblogs. ...

  4. Java异常处理及异常机制介绍

    Java异常处理及异常机制介绍 当出现程序无法控制的外部环境问题(用户提供的文件不存在,文件内容损坏,网络不可用...)时,JAVA就会用异常对象来描述. JAVA中用2种方法处理异常: 1.在发生异 ...

  5. JAVA 之 UNCAUGHTEXCEPTIONHANDLER异常处理机制

    JAVA 之 UNCAUGHTEXCEPTIONHANDLER异常处理机制 1.JAVA 1.5版本出现的 UNCAUGHTEXCEPTIONHANDLER 当线程由于未捕获异常突然终止时调用的处理程 ...

  6. Java进阶02 异常处理

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 程序很难做到完美,不免有各种各样的异常.比如程序本身有bug,比如程序打印时打印机 ...

  7. java实验四结果,java实验四异常处理.doc

    java实验四异常处理.doc 实验四异常处理一.实验目的1.掌握异常的概念和Java异常处理机制.2.掌握异常的定义.抛出和捕捉处理.二.实验内容与要求1.仔细读下面的JAVA语言源程序,自己给出程 ...

  8. Java自学之异常处理——自学笔记

    Java提高篇--Java 异常处理 阅读目录 异常的概念 异常的体系结构 Java 异常的处理机制 异常处理的基本语法 异常链 自定义异常 总结 回到顶部 异常的概念 异常是程序中的一些错误,但并不 ...

  9. java future 异常处理_Java异常处理总结

    转自:http://blog.51cto.com/lavasoft/18920 Java异常处理总结 异常处理是程序设计中一个非常重要的方面,也是程序设计的一大难点,从C开始,你也许已经知道如何用if ...

最新文章

  1. python ssh模块有哪些_Python paramiko模块(实现ssh)
  2. Logstash(二)input、codec插件详解
  3. SSL证书安装指南 - Winodws 2003 Server IIS 6.0
  4. 枚举类能继承吗?能被继承吗?
  5. 04.local_gateway和network相关设置
  6. 字符串池化,减少了三分之一的内存占用
  7. python--从入门到实践--chapter 10 文件及错误
  8. OpenCV与图像处理学习二——图像直方图与色彩空间
  9. Ural 1627 Join(生成树计数)
  10. ADO.NET高级应用
  11. 【C++】局部变量、全局变量、静态变量与动态对象的性质
  12. 如何直观理解拉格朗日乘子法与KKT条件
  13. sqlserver 修改表字段长度(好记性不如烂笔头)
  14. manjaro 安装 tim 后无法输入中文
  15. Flutter—— 仿自如APP裸眼3D效果
  16. 手机上如何将图片压缩到最小
  17. c语言香农编码文件压缩,谈谈熵编码无损压缩的原理
  18. C++实现first集follow集
  19. HTML5+CSS大作业——简单的程序员个人博客(7页) 大学个人博客网页制作教程 表格布局网页模板
  20. keystore生成证书实例

热门文章

  1. Gradle自定义插件
  2. 使用NoSQL实现实体服务–第4部分:Java EE
  3. Java是否越来越接受静态导入?
  4. Subversion(SVN)/TortoiseSVN 的分支合并方法
  5. Linux 命令之 yum -- 基于 RPM 的软件包管理器
  6. sql server 2008 年累计数_Windows Server 2008 和 SQL Server 2008将终止支持 迁移至Azure 微软提供3年免费技术支持...
  7. c语言线程传int值,如何用C语言实现多线程
  8. 工业计算机改造报告,工业计算机实验报告..docx
  9. 通过反汇编来理解restrict关键字
  10. 从数据的角度解析计算机的发展,2017计算机知识考前冲刺试题及答案