什么是异常?

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

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. javascript模块化编程库require.js的用法

    随着javascript的兴起,越来越多的公司开始将JS模块化,以增加开发的效率和减少重复编写代码的.更是为了能更加容易的维护日后的代码,因为现在的随着人们对交互效果的越来越强烈的需求,我们的JS代码 ...

  2. CSS盒模型的深度思考及BFC

    本文最初发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. 题目:谈一谈你对CSS盒模型的认识 专业的面试,一定会问 CSS 盒模型 ...

  3. trigger click 和 click 的区别??

    trigger click 和 user click 有什么区别吗? 好像没有的.直到发现了这样一段代码. <button class="btn1">Button< ...

  4. Android动态改变App在Launcher里面的icon

    如果呆萌的产品童鞋让你动态更换App在Launcher里面的Icon,你怎么回答他,下文就提出一种实现该效果的方法. 原理1--activity-alias 在AndroidMainifest中,有两 ...

  5. Windows2003查看远程桌面连接的用户

    要查看通过远程连接windows2003的用户,则打开任务管理器,切换到“用户”选项卡上进行查看.

  6. dojo表格内容居左、居中和居右

    1.常规表格内容居左.居中和居右 style="text-align:left;" style="text-align:center;" style=" ...

  7. JXL组件生成报表报错(一)

    JXL组件生成报表 1.具体报错如下 usage: java org.apache.catalina.startup.Catalina [ -config {pathname} ] [ -nonami ...

  8. 获取JSON对象的属性值

    1.问题背景 有一个json对象,其中有键值对,那怎样获取json对象中属性值 2.实现源码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 ...

  9. 畅通工程续 HDU - 1874

    某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多.这让行人很困扰. 现在 ...

  10. 动态添加弹出页面(shiro项目中来的七)

    一,图解 二,代码 2.0,新增代码 //打开编辑属性(新增) function dialog_open(){ $("#dialog-add").css("display ...