与C++、python,Ruby一样,Java也有一个异常处理机制,当程序出现异常时,系统会自动生成一个Exception对象通知程序去处理。之所以这样设计目的在于使程序有更好的容错性和可读性,实现业务代码和错误处理代码的分离。比如:

try{

//业务代码

}catch(ExceptionClass e){

//处理代码

}catch(Excepton i){//括号内为形参

//是不是有点像if-else语句

}

抛出:生成一个异常对象后,异常送给运行环境处理,这里并不是什么严格定义,理解就行。那另一个专业词捕获意思是把异常交给catch异常处理块,就是catch异常,如果找不到合适的catch块会结束程序。每个catch块会处理专门的异常,就像园括号里的。多个catch块针对不同的异常,但每次只有一个catch块被执行。同时需要注意的是,catch块是不能访问try块的局部变量,只在try块中有效。

异常类的继承和分类

分类:

所以从上面的图来看,非正常情况分为两种,Exception、Error。Error一般是指虚拟机相关的问题,如:虚拟机错误,系统故障等无法用程序修复的,结果就是程序中断。其实还可以把异常分为两大体系:Checked检查异常,Runtime运行时异常,所有RuntimeException类及其子类实例成为运行时异常,其他异常为可检查异常(认为可修复处理的,必须显式处理否则无法通过编译)。

程序总是把Exception异常放到最后,如果放到前面,程序将直接进入该catch块,try块异常语句后面其他块不会有机会被执行。(所以异常对象是Exception及其子类的实例) 原则上应该先处理小异常,再处理大异常。

Java7提供多捕获异常

从Java7开始catch块可以捕获多个异常,注意以下几点即可:

多种异常用|隔开 2.异常变量不能被重新赋值,即它们都是隐式的final修饰

catch(FileNotFoundExcepton e|ArithmeticException i){...}

访问异常信息,异常跟踪栈

异常对象一般有以下几个方法:

getMessage():返回异常的详细描述

printStackTrace():将异常跟踪栈信息到标准错误输出

printStackTrace(PrintStream s):将异常跟踪栈信息输出到指定流

getStackTrace():返回该异常的跟踪栈信息(注意是返回)

一系列方法被调用,形成了方法栈,发生异常时,异常向方法调用者传播,然后再传给其调用者...,跟踪栈记录程序异常发生点,执行停止位置,并标明类、方法、所在行。跟踪栈总是最内部的被调用方法上传,直到最外部操作起点,通常为main方法或Thread类的run方法。

finally关键字

在异常处理中,这里的finally不是必要的,那为啥要增添一个不必要的关键字呢?前面一篇提到过GC垃圾回收机制只会回收堆内存中的资源,不会回收其他资源(比如像网络连接、文件、数据库连接等)。为了保证一定能回收这些资源,机制提供了finally关键字去处理。也就是说,finally块的优先级是比较高的,即使try或catch强制方法返回,除非要强制退出JVM,如System.exit(1)。

异常处理嵌套

嵌套是指异常处理的代码的嵌套,可以在try、catch,finally块中。

finally{

if(file != null){

file.close();

}

}

Java7增强了try语句,允许后面紧跟圆括号,括号内可声明,初始化多个需关闭的资源,也就是说,不用finally块也能最后回收这些资源,这里是指不用显式的块,其实还是隐式的用它。前提是,这些资源类必须实现AutoCloseable或Closeable接口,即需要重写close方法。Java7几乎把资源类都改写了,改写后都实现了两个或一个的接口。

Closeable是AutoCloseable的子接口,可以被自动关闭的类要么实现Closeable接口,要么实现AutoCloseable接口,但都需要实现close方法。Closeable接口的close方法只能抛出IOException异常,所以实现时只能抛出其及子类;而AutoCloseable的close方法能抛出所有异常类。

try(BufferedReader br = new BufferedReader("Test.java");

PrintStream ps = new PrintStream(new FileOutputStream("a.txt"));){

System.out.println(br.readLine());

ps.println("ok!");

}

throws声明

当程序不知道如何处理这种异常时,会将异常抛出,交给上级处理。如果main方法不知道处理,同样throws抛出异常给JVM处理。JVM会打印异常跟踪栈信息,中止程序运行。用法就是只能在方法签名中使用,但是可以抛出多个异常类。

throws IndexOutBoundsException,IOException...//抛出异常类

throws抛出异常时有限制:子类方法抛出的异常要是父类抛出异常类型或其子类,且不能比父类抛出的异常还多。

相对来说,抛出Runtime异常是比较省事的。

throw

当程序出现错误,系统会自动抛出异常,Java程序也会抛出异常。自行抛出异常由throw语句实现,注意没有s。throw语句可以单独使用,像普通程序语句一样,重要的是:它抛出的不是异常类,而是实例对象。throw自行抛出的异常同样会中止当前程序执行,然后跳到相应的catch块处理异常。同时为了更好的处理异常,让用户有一个完美的体验,throw和catch可以结合使用,程序对异常部分处理,然后抛给调用者处理。

public void test() throws MyException{

try{

...

}catch(Exception e){

throw new MyException("抛出给方法调用者");

}

}

如果throw语句抛出的是checked异常,throw语句可以放在try块中捕获,也可以放在带throws声明的抛出方法中,把异常交给该方法的调用者处理;如果抛出的是Runtime异常,则无须放在try块,也无需放在带throws声明的方法中。但是真的要处理的话,程序可以try...catch捕获该异常,也可以也可以不用理会。

这里需要提一下throw语句的一个变化:在Java7以前,编译器根据throw语句抛出的异常类型从而判定该方法需要声明throws抛出的异常类型,而Java7开始,增强了语句,编译器会根据实际判断throw语句处的异常类型,从而该方法可以声明抛出实际的异常类型。

public void test() throws FileNotFoundException{

try{

new FileOutputStream("a.txt");

}catch(Exception e){

e.printStackTrace();

throw e;

}

}

自定义异常

抛出异常时,选择合适的异常很有必要,所以需要自定义异常。自定义异常则需要继承Exception类,或继承RuntimeException异常。定义异常通常要两个构造器,一个无参,一个有参(字符串参数,描述异常详细信息,即getMessage方法返回值)

public class MyException extends Exception{

public MyException(){} //需要的话可以换成RuntimeException

public MyException(String msg){

super(msg);//调用父类构造器

}//msg会传给异常对象的message属性

}

异常链

在实际的开发中,原始的异常信息往往是不被外界用户所知晓的,但是异常发生时需要通知用户情况,因此在处理异常时会进行异常的链式处理。

public test() throws MyException{

try{

//业务代码

}catch(Exception e){

//原始异常记录下来...

throw new MyException("系统出现未知异常");//用户提示

}

}

这种捕获一个异常然后抛出一个异常,并把原始异常信息保存下来,被称为“异常链”,是一种典型的链式处理模式:职责链模式。

JDK1.4开始,Throwable子类重载了一个构造器,该构造器可接收一个cause对象作为参数,cause表示原始异常,那这样就能把原始异常传给新异常,从而进行链式处理。

try{

//

}catch(SQLException e){

//记录异常,再抛出异常对象

throw new SQLException(e);

}catch(Exception e){

throw new SQLException(e);

}

构造器很简单,如下:

public MyException(Throwable t){

super(t);

}//已继承Exception类

异常处理规则

不要过度使用异常

不要使用过大的try块

避免使用catchall 语句

不要忽略捕获的异常

异常处理的初衷是将业务代码和异常处理代码分离,所以别另作他用!此外,需要注意的是,异常处理的效率比正常的流程控制的差,所以异常处理使用过多也不是好事。catch All语句虽然可以处理所以异常,但需要分情况处理时得不偿失,或者需要得到特定异常时。

java 抛出异常效率_Java异常处理机制相关推荐

  1. java异常应用_Java异常处理机制 —— 深入理解与开发应用

    本文为原创博文,转载请注明出处,侵权必究! Java异常处理机制在日常开发中应用频繁,其最主要的不外乎几个关键字:try.catch.finally.throw.throws,以及各种各样的Excep ...

  2. java 异常管理员_Java异常处理机制

    Java 中的异常(Exception)又称为例外,是一个在程序执行期间发生的事件,它中断正在执行的程序的正常指令流.为了能够及时有效地处理程序中的运行错误,必须使用异常类. 一.异常简介 在程序中, ...

  3. Java Android未捕获异常处理机制

    Java & Android未捕获异常处理机制 参考文章: (1)Java & Android未捕获异常处理机制 (2)https://www.cnblogs.com/lwbqqyum ...

  4. java异常详细讲解_Java异常处理机制的详细讲解和使用技巧

    一起学习 1. 异常机制 1.1 异常机制是指当程序出现错误后,程序如何处理.具体来说,异常机制提供了程序退出的安全通道.当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器. 1.2 ...

  5. java异常处理代码详解_Java异常处理机制总结

    概念介绍 异常是发生在程序执行过程中阻碍程序正常执行的错误事件,当一个程序出现错误时,可能的情况有如下3种: 语法错误 代码的格式错了,某个字母输错了 运行时错误 空指针异常,数组越界,除数为零等 逻 ...

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

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

  7. 黑马程序员_java异常处理机制

    java异常处理机制 1:什么是异常? 异常(Exception)也叫例外.在Java编程语言中,异常就是程序在运行过程中由于硬件设备问题.软件设计错误.缺陷等导致的程序错误.在软件开发过程中,很多情 ...

  8. linux java url 异常_java异常处理总结

    找到一个关于异常总结的很详细的文章,分享下.异常在我们编程中很重,在适当的位置,合理的处理或者抛出异常,对程序来说至关重要. 转:异常处理是程序设计中一个非常重要的方面,也是程序设计的一大难点,从C开 ...

  9. java 反射代价_Java反射机制

    # 反射 ## 什么是反射 反射是Java提供的动态执行机制, 可以动态加载类, 动态创建对象, 动态访问属性, 动态调用方法.. 静态执行: Java代码经过编译以后就确定的执行次序, 称为静态执行 ...

最新文章

  1. C和C++混合编程的Makefile的编写!
  2. 我对软件行业及大数据的理解
  3. 全球及中国有机肥料行业投资价值与营销品牌战略报告2022版
  4. 图解设计模式-Abstract Factory模式
  5. unix下批量进程的创建和强杀命令
  6. js 确定主窗体是否存在
  7. LeetCode-697. 数组的度
  8. 热血传说复古传奇老显示服务器维护,《复古传奇之热血传说》新系列地图,新的装备即将出现...
  9. 再见beycond comapre,适合程序员使用的免费文件对比工具——CCompare1.14
  10. java的图标及由来
  11. android内部dex解析,DEX文件解析---1、dex文件头解析
  12. SWFUpload使用指南
  13. 3无重复字符的最长子串longest-substring-without-repeating-characters
  14. 飞行射击游戏的C++实现:一次课程作业
  15. 【电气专业知识问答】问:电力系统稳定器PSS的定义和功能是什么?投用时应注意哪些问题?
  16. C语言100个囚徒和灯泡,经典算法问题其一:百日囚徒问题
  17. 中国统计,向着“大数据时代”迈进!
  18. python 调用 CTP API 进行下多单 下空单 平单 撤单 操作
  19. 解决办法 Field userService in com.sxsj.controller.RegistLoginController required a bean of type
  20. gpio复用 海思_对海思上GPIO的一点理解

热门文章

  1. intel服务器修复两个漏洞,英特尔处理器漏洞怎么修复 Intelcpu漏洞修复方法
  2. python导入xlrd库_python中xlrd库如何实现文件读取?
  3. 绕开登录进行爬虫_爬虫小偏方:绕开登陆和访问频率控制
  4. vmware虚拟机克隆后不能联网
  5. 第一门语言学python好_零基础学编程,哪一门语言比较适合入门?
  6. python爬虫爬取雪球网_Python爬虫爬取天天基金网基金排行
  7. 【Golang 接口自动化05】使用yml管理自动化用例
  8. Oracle数据库只读事务和无事务的区别
  9. CentOS 最小化安装后安装桌面
  10. 从零开始学习ASP.NET MVC 入门