Java异常机制简介
什么是异常?
异常一般是指程序在编译期没有问题,但是在程序运行期出现的错误,一个程序会因为出现异常而终止运行,也就是我们常说的挂掉,在多线程下,异常只会影响所在的线程,对其他线程没有影响。
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
利用try-catch语句捕获并处理异常
- 在出现异常所在的方法声明处通过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异常机制简介的更多相关文章
- 全面理解java异常机制
在理想状态下,程序会按照我们预想的步骤一步一步的执行,但是即使你是大V,你也不可避免出错,所以java为我们提供了异常机制.本文将会从以下几个方面介绍java中的异常机制: 异常机制的层次结构 异常的 ...
- Java 异常机制
Java 异常机制 什么是异常 异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程 为什么要有异常 什么出错了 哪里出错了 ...
- 【55】java异常机制剖析
一.为什么要使用异常 首先我们可以明确一点就是异常的处理机制可以确保我们程序的健壮性,提高系统可用率.虽然我们不是特别喜欢看到它,但是我们不能不承认它的地位,作用.有异常就说明程序存在问题,有助于我们 ...
- Java异常机制及异常处理建议
1.Java异常机制 异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通过API中Throwable类的众多子类 ...
- [Java学习笔记] Java异常机制(也许是全网最独特视角)
Java 异常机制(也许是全网最独特视角) 一.Java中的"异常"指什么 什么是异常 一句话简单理解:异常是程序运行中的一些异常或者错误. (纯字面意思) Error类 和 Ex ...
- Java异常机制
Java异常分类 异常表明程序运行发生了意外,导致正常流程发生错误,例如数学上的除0,打开一个文件但此文件实际不存在,用户输入非法的参数等.在C语言中我们处理这类事件一般是将其与代码正常的流程放在一起 ...
- Java基础 -- 深入理解Java异常机制
异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通 过API中Throwable类的众多子类描述各种不同的异常. ...
- 一张图搞清楚Java异常机制
下面是Java异常类的组织结构,红色区域的异常类表示是程序需要显示捕捉或者抛出的. Throwable Throwable是Java异常的顶级类,所有的异常都继承于这个类. Error,Excepti ...
- Java异常机制,自定义异常以及spring boot异常设计方案
异常机制: 异常概念 异常分类 异常的处理方法 自定义异常 springboot 的异常解决方案
随机推荐
- JavaScript预编译原理分析
一直对变量对象,活动对象,预编译,变量提升,执行上下文的时间顺序有着凌乱的认识,但是这些对理解JS语法有着很重要的作用.读了很多人的文章,都没有一个特别清晰的把这些写出来. 今天主要总结一下现阶段自己 ...
- 多文件工程的编译-Makefile的简便写法
通常我们在命令行使用GCC对程序进行编译,如果对于单个或者几个文件时比较方便的,但当工程中的文件逐渐增多甚至变得十分庞大的时候,使用GCC显然力不从心,不好管理.因此我们有必要编写一个Makefile ...
- Micropython 如何用Turnipbit做一个自动浇水装置
最近在研究Turnipbit这块板子,打算是连接一个摄像头模块,正在实验练习中,(祝自己早日弄好)上篇文章我们讲了用Turnipbit连接LCD5110显示英文词句,前几天给家里花浇水的时候发现花招了 ...
- 基于LDA的Topic Model变形
转载于: 转:基于LDA的Topic Model变形 最近有想用LDA理论的变形来解决问题,调研中.... 基于LDA的Topic Model变形 基于LDA的Topic Model变形最近几年来,随 ...
- 使用xfire搭建webService服务
后边有个项目需要接入4A,要用到webService服务,暂时还不确定是不是会有我的事,但为了有备无患,还是抽时间学习了以下相关的知识. 本来我所了解到的发布webService服务有用cxf和xfi ...
- HI3531串口测试程序(arm)
#include<stdio.h> unsigned int UART0_ADDR = 0x20080000; unsigned int retu=0; int i=0; void del ...
- linux之x86裁剪移植---字符界面sdl开发入门
linux下有没有TurboC2.0那样的画点.线.圆的图形函数库,有没有grapihcs.h,或者与之相对应或相似的函数库是什么?有没有DirectX这样的游戏开发库?SDL就是其中之一. SDL( ...
- Oracle连接出错(一)
1.错误描述 java.sql.SQLException: ORA-0064:error occurred at recursive SQL level 1. ORA-06153:unable to ...
- java中equals和==以及toString
我们通常在控制台输出时使用System.out.print(),print只能直接输出基本类型和字符串,对于其他的类型直接输出将会输出@开头的引用,因此若需要输出对应的内容则需要使用toSring方法 ...
- Linux命令之finger
Linux命令之finger youhaidong@youhaidong-ThinkPad-Edge-E545:~$ finger 程序"finger"尚未安装. 您可以使用以下命 ...