什么是异常?

异常一般是指程序在编译期没有问题,但是在程序运行期出现的错误,一个程序会因为出现异常而终止运行,也就是我们常说的挂掉,在多线程下,异常只会影响所在的线程,对其他线程没有影响。

Java异常的分类:

Java是一种面向对象的编程语言,Java把异常也看成是一个对象。Throwable是所有异常的父类,有两个子类继承于他,分别是Exception和Error,Exception是我们经常看到的异常的父类,而Error我们很少遇到过,出现Error这种错误的时候我们是无法通过更改代码解决的,例如虚拟机运行出现错误等。

Exception在书上被分为运行时异常,和非运行时异常,很好理解,运行时异常也是非检查异常,Java编译器不会去检查他,即使没有try-catch处理,throws抛出,程序还是会编译通过。就是在程序运行的时候会出现错误,由于程序代码不会处理运行时异常,如果出现就会导致程序运行的终止。如下图的空指针异常和数组下标越界异常,是我们代码运行出错导致的,我们可以通过改变代码的结构避免此类异常的出现。

非运行时异常也叫受检查异常,除了运行时异常及其子类以外,其他的Exception类及其子类都属于受检查异常,如下图的IOException,SQLException。这种异常的特点就是Java编译器会检查他,在程序运行前,如果不加处理,编译器就会提示,程序无法编译运行,要么用try-catch捕获,要么throws抛出。

Java处理异常的机制:

Java是一种面向对象的编程语言,同样把异常也用面向对象的思想进行处理,使程序有更好的维护性。

当程序中的语句可能抛出异常的时候,有两种处理方式:

说处理方式之前先记住Java异常这里的五个关键字:try,catch,finally,throw,throws

  1. 利用try-catch语句捕获并处理异常

  2. 在出现异常所在的方法声明处通过throws声明抛出异常,这种处理异常方式不太友好。

第一种利用try-catch语句捕获并处理异常,把可能出现异常的语句放在try语句块中(尝试着运行),catch捕获可能出现的异常,catch语句块中写入处理异常的语句,一般情况下我们在catch中写入处理异常的代码。注意try代码块不能单独出现,后面必须有catch或者finally代码块,在catch和finally代码块共存的时候,finally代码块一定要在catch后面,finally代码块是在最后执行的,例如我们连接数据库操作之后,一般吧资源的关闭操作都写在finally代码块中。在try后面的catch代码块会依次执行,直到捕获到异常。在各个代码块中定义的变量属于局部变量,不能在其他的代码块中使用。

try {
// 要出现异常的代码
throw new IOException();
} catch (IOException e) {
// 处理异常语句
} finally {
// 最终执行的代码
}

这里细说一下finally关键字,finally最终的意思,也就是说finally中的代码最后一定会被执行,编译器确实也是这么做的,不管return写在了finally代码块之前还是之后,finally中的代码一定会被执行完之后再执行return返回,这是一道面试题,考察的就是finally代码块执行的方式。

 public static void print() {
try {
System.out.println("try");
return;
}finally {
System.out.println("finally");
}
}

当执行上面的代码输出的是:

try

finally

也就说finally中的代码在return之前执行了

第二种利用关键字throws声明抛出异常:throws关键字一定是在方法声明的后面,个人认为这种处理异常的方式是很不负责任的行为,如果一个方法中的代码可能出现异常,没有能力来处理这个异常,就要把这个异常抛出,当某个方法调用这个抛出异常的代码的时候,如果还没有处理这个异常那就还要抛出,一级一级的,直到有方法处理了这个异常。

public void print() throws IOException {
throw new IOException();
}

上面的方法体中抛出异常的语句,抛出的异常对象必须是Thtoeable类或者是其子类

throw new String("不是异常");

以上代码不合法,String类不是异常类

自定义异常:

有时候我们可能在特定的处理业务上有着自己的一套异常信息,原有的异常类不能满足我们的需求,就需要我们扩展异常,自定义异常。继承Exception

public class MyException extends Exception {

    public MyException(String message) {
super(message);
} public MyException() { }
}

使用:

 public static void print() {
try {
throw new MyException("除数为0");
} catch (MyException e) {
e.printStackTrace();
}
}

调用输出:

我们平时写异常的代码的时候经常是在catch代码块中用printStackTrace()方法将异常信息输出,其实不是处理异常,只是测试时候可以看到出现了什么异常。很多代码中的异常都是由于书写的逻辑有问题,只要适当改变代码结构,即可避免异常的产生。

Java异常机制简介的更多相关文章

  1. 全面理解java异常机制

    在理想状态下,程序会按照我们预想的步骤一步一步的执行,但是即使你是大V,你也不可避免出错,所以java为我们提供了异常机制.本文将会从以下几个方面介绍java中的异常机制: 异常机制的层次结构 异常的 ...

  2. Java 异常机制

    Java 异常机制 什么是异常 异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程 为什么要有异常 什么出错了 哪里出错了 ...

  3. 【55】java异常机制剖析

    一.为什么要使用异常 首先我们可以明确一点就是异常的处理机制可以确保我们程序的健壮性,提高系统可用率.虽然我们不是特别喜欢看到它,但是我们不能不承认它的地位,作用.有异常就说明程序存在问题,有助于我们 ...

  4. Java异常机制及异常处理建议

    1.Java异常机制 异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通过API中Throwable类的众多子类 ...

  5. [Java学习笔记] Java异常机制(也许是全网最独特视角)

    Java 异常机制(也许是全网最独特视角) 一.Java中的"异常"指什么 什么是异常 一句话简单理解:异常是程序运行中的一些异常或者错误. (纯字面意思) Error类 和 Ex ...

  6. Java异常机制

    Java异常分类 异常表明程序运行发生了意外,导致正常流程发生错误,例如数学上的除0,打开一个文件但此文件实际不存在,用户输入非法的参数等.在C语言中我们处理这类事件一般是将其与代码正常的流程放在一起 ...

  7. Java基础 -- 深入理解Java异常机制

    异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通 过API中Throwable类的众多子类描述各种不同的异常. ...

  8. 一张图搞清楚Java异常机制

    下面是Java异常类的组织结构,红色区域的异常类表示是程序需要显示捕捉或者抛出的. Throwable Throwable是Java异常的顶级类,所有的异常都继承于这个类. Error,Excepti ...

  9. Java异常机制,自定义异常以及spring boot异常设计方案

    异常机制: 异常概念 异常分类 异常的处理方法 自定义异常 springboot 的异常解决方案

随机推荐

  1. java 集合框架(十)List

    一.概述 List是一种有序集合,有时也被称为序列,可以有重复的元素.List集合相比Collection,除了直接继承的方法外,有以下拓展的操作方法 位置访问---可以基于元素索引来操作元素,比如g ...

  2. 对HI3531的GPIO使用的再分析

    在一个嵌入式系统中使用最多的莫过于 通用输入输出 GPIO口.看到论坛中经常有朋友问海思为什么没有提供GPIO驱动.其实不然. 在海思SDK  xxx/osdrv/tools/board_tools/ ...

  3. 用开源的 ffmpeg 实现屏幕录像机

    在我看来,FFmpeg 绝对是一个很酷的应用.那么,它究竟有什么用呢?简单地讲,FFmpeg 相当于一个屏幕录像机.你可以使用它将屏幕上的操作过程录制下来,然后再将其播放给别人看.我们可以利用它制作教 ...

  4. apache在window server 2003下的安全配置

    在window server2003下安装apache apache 默认有system权限.所以要先对apache进行降权. 添加用户.我的电脑右击 ->管理->本地用户和组

  5. 程序bug致损失400亿,判程序员坐牢? 搞笑我们是认真的

    号外!号外!走过,路过,不要错过!日本 IT 业的狗血八卦继续独家放送啦!! 2015 年 9 月 3 日,随着东京最高法院驳回瑞穗证券的上诉,维持二审的原判结果,一个长达 10 年的诉讼终于画下了句 ...

  6. SCADA系统

    简介编辑 在电力系统中,SCADA系统应用最为广泛,技术发展也最为成熟.它在远动系统中占重要地位,可以对现场 SCADA系统 的运行设备进行监视和控制,以实现数据采集.设备控制.测量.参数调节以及各类 ...

  7. 原生js简单调用百度翻译API实现的翻译工具

    先来个在线demo: js翻译工具 或者百度搜索js简单调用百度翻译API工具(不过有个小小的界面显示bug,我想细心的人应该会发现) 或者直接前往该网址:js翻译工具 或者前往我的github:gi ...

  8. sql一张表中两个字段指向同一个外键

    在项目开发中遇到这么一个例子,首先产品表 tb_product ----------------------------- id    name 1     手机 2    电脑 3     笔记本 ...

  9. js 函数中的 return+匿名函数

    今天一个刚学js的朋友给了我一段代码问为什么方法不执行,代码如下: 代码如下: function makefunc(x) {  return function (){   return x;  } } ...

  10. 【原】Spring Boot 配置swagger2没有文档解决方案

    @Bean public Docket customImplementation(){ return new Docket(DocumentationType.SWAGGER_2) .select() ...