异常体系结构

1、所有异常都继承于Throwable类,其下有两大子类:

(1)Error类:错误,一般编程人员不太接触,如虚拟机错误、线程死锁。硬伤:使程序崩溃

(2)Exception类:异常,编码、环境、用户输入等问题,其子类主要有:

· 非检查异常(运行时异常RuntimeException):【由java虚拟机自动捕获】如空指针NullPointer、越界ArrayIndexOutofBounds、错误类型转换ClassCast、算数异常Arithmetic   等。

· 检查异常CheckException:【需要手动添加捕获和处理语句】文件异常IO等。

异常处理

一、try-catch(多catch块)-finally

(1)try块:负责捕获异常,一旦try中发现异常,程序的控制权将被移交给catch块中的异常处理程序。【try语句块不可以独立存在,必须与 catch 或者 finally 块同存】

(2)catch块:如何处理?比如发出警告:提示、检查配置、网络连接,记录错误等。执行完catch块之后程序跳出catch块,继续执行后面的代码。

· 编写catch块的注意事项:多个catch块处理的异常类,要按照先catch子类后catch父类的处理方式,因为会【就近处理】异常(由上自下)。

(3)finally:最终执行的代码,用于关闭和释放资源等

===================
异常处理

try-catch以及try-catch-finally

try{

  //一些会抛出的异常

}

catch(Exception e){

  //处理该异常的代码块

}

finally{

  //最终要执行的代码

}

如果在try语句块中的任何代码抛出了一个在catch子句中说明的异常类,那么:

1)程序将跳过try语句块的其余代码。

2)程序将执行catch子句中的处理器代码。

如果在try语句块中的代码没有抛出任何异常,那么程序将跳过catch子句。

如果方法中的任何代码抛出了一个在catch子句中没有声明的异常类型,那么这个方法就会立即退出。

终止执行,交由异常处理程序(抛出提醒或记录日志等),异常代码块外代码正常执行。

try会抛出很多种类型的异常,多个catch块捕获多钟错误。

多重异常处理代码块顺序问题:先子类再父类(顺序不对也会提醒错误),finally语句块处理最终将要执行的代码。

try语句可以只有finally子句,而没有catch子句。事实上,在需要关闭资源时,用这种方式使用finally子句是一种不错的选择。

注:
1、try…catch…捕获单个异常,当有多个异常时,使用多重catch语句。【注意:顺序问题(先子类后父类)】
2、InputMismatchException输入不匹配异常;ArithmeticException算数异常。
3、finally语句用于处理异常后的善后工作,比如关闭打开的网址,打开的文件等等。

return在try-catch-finally中:

1、不管有没有出现异常,finally块中代码都会执行;

2、当try和catch中有return时,finally仍然会执行;

3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,仍然是之前保存的值),所以函数返回值是在finally执行前确定的;

4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。

注:
1、e.printStackTrace()可以输出异常信息;
2、-1为抛出异常的习惯写法;
3、如果方法中try, catch, finally中没有返回语句,则会调用这三个语句块之外的return结果;
4、finally块无论如何,不管前面是正常还是异常,都要执行;
5、finally 在try中的return之后 在返回主调函数之前执行。

异常抛出

两个重要的关键字:throw 和 throws

throw -- 将产生的异常抛出(动作)

throws -- 声明将要抛出何种类型的异常(声明)

  public void 方法名 (参数列表) throws 异常列表 {

    //调用会抛出异常的方法或者:

    throw new Exception(); 

  }

1、throws的异常列表可以是抛出一条异常,也可以是抛出多条异常,每个类型的异常中间用逗号隔开。

2、方法体中调用会抛出异常的方法或者是先抛出一个异常:用throw new Exception()
    throw写在方法体里,表示“抛出异常”这个动作。

3、如果某个方法调用了抛出异常的方法,那么必须添加try catch语句去尝试捕获这种异常。

自定义异常

class 自定义异常类 extends 异常类型{

}

Java中的异常链

只有Error,Exception,RuntimeException提供了带cause参数的构造器,其他的所有异常类只能通过initCause()来设置cause。

所有Throwable的子类构造器中都可以接受一个cause对象作为参数。cause是异常原由,代表着原始异常。既可以在当前位置创建并抛出行的异常,也可以通过cause追踪到异常最初发生的位置。

异常链是一种面向对象编程技术,指将捕获的异常包装进一个新的异常中并重新抛出的异常处理方式。原异常被保存为新异常的一个属性(比如cause)。这个想法是指一个方法应该抛出定义在相同的抽象层次上的异常,但不会丢弃更低层次的信息。

把捕获的异常包装成新的异常,在新异常里添加原始的异常,并将新异常抛出,它们就像是链式反应一样,一个导致(cause)另一个。

实现异常链功能的两种基本写法:

public class chainTest {

/**
* @param args
* Test1抛出喝大了异常
* Test2调用test1捕获了喝大了异常,并且包装成运行时异常,继续抛出
* main方法中调用test2尝试捕获test2方法抛出的异常
*/
  public static void main(String[] args) {
    try{ // TODO Auto-generated method stub
    chainTest ct=new chainTest();
    ct.Test2();     }
    catch(Exception e){
    e.printStackTrace();
    }
  }   public void Test1()throws DrunkException{
    throw new DrunkException("喝车别开酒");
  }   public void Test2(){
    try{
      Test1();
    }     catch( DrunkException e){
      RuntimeException rte=new RuntimeException(e);
      //rte.initCause(e);       throw rte;
    }
  }
}

带资源的try语句

如果try块抛出一个异常,而且close方法也抛出一个异常,这就会带来一个难题。带资源的try语句可以很好地处理这种情况。

带资源的try语句的最简单形式为:

try (Resource res = ...)

{

  work with res

}

try块退出时,会自动调用res.close()。

应用中的经验与总结

1、处理运行时异常时,采用逻辑去合理规避同时辅助try-catch处理

2、在多重catch块后面,可以加一个catch(Exception)来处理可能会被遗漏的异常

3、对于不确定的代码,也可以加上try-catch,处理潜在的异常

4、尽量去处理异常,切忌只是简单的调用printStackTrace()去打印

5、具体如何处理异常,要根据不同的业务需求和异常类型去决定

6、尽量添加finally语句块去释放占用的资源

Java异常与异常处理的更多相关文章

  1. 第11章 Java异常与异常处理

    1.Java异常简介 1.什么是异常异常出现的时候代码会无法正常运行下去,会产生各种问题2.捕捉异常的作用提早发现异常,方便查找问题,并给出解决方法3.Java中的异常1.Java中所有不正常的类都是 ...

  2. java异常,异常处理,异常类 关键字:throws 和 throw 自定义的异常类

    package cn.kecheng; import java.util.Scanner; /**异常:异常是指在程序的运行过程中所发生的不正常的情况,它会中断正在运行的程序 异常处理机制:java中 ...

  3. Java异常与异常处理简单使用

    异常就是程序运行过程中阻止当前方法或作用域继续执行的问题: 任何程序都不能保证完全正常运行,当发生异常时,需要我们去处理异常,特别是一些比较重要的场景,异常处理的逻辑也会比较复杂,比如:给用户提示.保 ...

  4. 那些年,我们不懂的却又不得不提的 JAVA异常和异常处理!

    ---恢复内容开始--- 首先,我是个小小的菜鸟,最近突然突发奇想,想研究一下java的异常和异常的处理,稍有些理解,老鸟们莫要嘲笑... 既然要讲异常和异常的处理,我们就要先了解异常,那么,什么是异 ...

  5. JAVA异常与异常处理详解

    一.异常简介 什么是异常? 异常就是有异于常态,和正常情况不一样,有错误出错.在java中,阻止当前方法或作用域的情况,称之为异常. java中异常的体系是怎么样的呢? 1.Java中的所有不正常类都 ...

  6. Java异常及异常处理

    如果某个方法不能按照正常的途径完成任务,就可以通过另一种路径退出方法.在这种情况下会抛出一个封装了错误信息的对象.此时,这个方法会立刻退出同时不返回任何值.另外,调用这个方法的其他代码也无法继续执行, ...

  7. JAVA异常及其异常处理方式

    异常处理 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的.比如说,你的代码少了一个分号,那么运行出来结果是提示是错误 java.lang.Error:如果你用Syste ...

  8. JAVA异常与异常处理详解【转】

    感谢!!!原文地址:https://www.cnblogs.com/knightsu/p/7114914.html 一.异常简介 什么是异常? 异常就是有异于常态,和正常情况不一样,有错误出错.在ja ...

  9. JAVA 异常和异常处理

    目录 一.异常 1.基本概念 2.异常体系图 3.五大运行时异常 4.编译异常 二.异常处理 1.异常处理的方式 1.1try-catch异常处理 注意事项 课堂练习题 1.2throws异常处理 注 ...

随机推荐

  1. PLICP

    介绍 PLICP相比较于普通ICP算法,使用点线之间的距离作为度量,最终找到一个最小化该度量的闭式解(解析解). 最优结果以平方的速度收敛.相比较于ICP,IDC,MBICP.PLICP更加准确,且需 ...

  2. .Net Core with 微服务 - Polly 服务降级熔断

    在我们实施微服务之后,服务间的调用变的异常频繁.多个服务之间可能是互相依赖的关系.某个服务出现故障或者是服务间的网络出现故障都会造成服务调用的失败,进而影响到某个业务服务处理失败.某一个服务调用失败轻 ...

  3. 01_什么是BS结构,什么是CS结构?

    C/S和B/S都是互联网中常见的网络结构模型. 一.什么是C/S模型? C是英文单词"Client"的首字母,即客户端的意思,C/S就是"Client/Server&qu ...

  4. netcore一键nssm发布为windows服务

    AntDeploy 是我开发一款开源一键部署工具包 发布功能支持: docker容器一键部署 docker镜像一键发布 支持iis一键部署 windows服务一键部署 linux服务一键部署 支持增量 ...

  5. windows环境30分钟从0开始快速搭建第一个docker项目(带数据库交互)

    前言 小白直接上手 docker  构建我们的第一个项目,简单粗暴,后续各种概念边写边了解,各种概念性的内容就不展开,没了解过的点击 Docker 教程 进行初步了解. Docker 是一个开源的应用 ...

  6. linux下编译常见错误

    1.浮点数例外:除数为0 2.已杀死:空间过大 3.已放弃:时间过长 4.段错误:递归 / 循环出不来

  7. spring框架的学习->从零开始学JAVA系列

    目录 Spring框架的学习 框架的概念 框架的使用 Spring框架的引入 概念 作用 内容 SpringIOC的学习 概念 作用 基本使用流程 SpringIOC创建对象的三种方式 通过构造器方式 ...

  8. 就这?分布式 ID 发号器实战

    分布式 ID 需要满足的条件: 全局唯一:这是最基本的要求,必须保证 ID 是全局唯一的. 高性能:低延时,不能因为一个小小的 ID 生成,影响整个业务响应速度. 高可用:无限接近于100%的可用性. ...

  9. Color Theme of Emacs

    Choose color theme interactively: M-x customize-themes, or M-x color-theme-select (use key "q&q ...

  10. SpringMVC学习03(控制器Controller)

    3.控制器Controller 3.1 控制器Controller 控制器复杂提供访问应用程序的行为,通常通过接口定义或注解定义两种方法实现. 控制器负责解析用户的请求并将其转换为一个模型. 在Spr ...