【Java】 异常
异常分类

- 所有的异常都是由Throwable继承而来,但在下一层理解分解为两个类Error和Exception。
- Error类层次结构描述了Java运行时系统的内部错误和资源耗尽错误。应用程序不应该跑出这种类型的对象。如果出现了这样的内部错误,除了通告给用户,并尽力使程序安全地终止之外,再也无能为力。
- 在设计Java程序时,需要关注Exception层次,这个层次结构又分解为两个分支:一个分支派生于RuntimeException;另一个分支包含其他异常。划分两个分支的规则是:由程序错误导致的异常属于RuntimeException;而程序本身没有问题,但由于I/O错误这类问题导致的异常属于其他异常。
- 派生于RuntimeException的异常包含下面几种情况:
- 错误的派生类型
- 数组访问越界
- 访问空指针
不是派生于RuntimeException的异常包括: - 试图在文件尾部后面读取数据
- 试图打开一个不存在的文件
- 试图根据给定的字符串查找Class对象,而这个字符串表示的类并不存在。
- Java语言规范将派生于Error类或RuntimeException类的所有异常称为未检查(unchecked)异常,所有其他的异常称为已检查(checked)异常。
声明已检查的异常
方法应该在其首部声明所有可能出现抛出的异常。这样可以从首部反映出这个方法可能抛出哪类已检查异常。
public FileInputStream(String name) throws FileNotFoundException
- 在编写自己的方法时,不必将所有可能抛出的异常都进行声明。置于什么时候需要在方法中用throws子句声明异常,什么异常必须使用throws子句声明,需要记住在下面4种情况时应该抛出异常:
1)调用一个抛出已检查异常的方法,例如,FileInputStream构造器。
2)程序运行过程中发现错误,并且利用throw语句抛出一个已检查异常
3)程序出现错误,例如,a[-1]=0会抛出一个ArrayIndexOutOfBoundsException这样的未检查异常
4)Java虚拟机和运行时库出现的内部错误
如果出现了前两种情况之一,则必须告诉调用这个方法的程序员有可能抛出异常。因为任何一个抛出异常的方法都有可能是一个死亡陷阱。如果没有处理器捕获这个异常,当前执行的线程就会结束。 - 对于那些可能被他人使用的Java方法,应该根据异常规范(Exception specification),在方法的首部声明这个方法可能抛出的异常。
class MyAnimation {
public Image loadImage(String s) throws IOException {
...
}
}
如果一个方法有可能抛出多个已检查异常,那么就必须在方法的首部列出所有的异常类。每个异常类之间用逗号隔。如:
class MyAnimation {
poblic Image loadImage(String s) throws FileNotFoundException, EOFException {
...
}
}
但是,不需要声明Java的内部错误,即从Error继承的错误。任何程序代码都具有抛出那些异常的潜能,而我们对其没有任何控制能力。
同样,也不应该声明从RuntimeException继承的那些未检查异常。
class MyAnimation{
void drawImage(int i) throws ArrayIndexOutOfBoundsException { //bad style
...
}
}
这些运行时错误完全在我们的控制之下。如果特别关注数组下标引发的错误,就应该讲更多的时间花费在修正程序中的错误上,而不是说明这些错误发生的可能性上。
总之,一个方法必须声明所有可能抛出的已检查异常,而未检查异常要么不可控制(Error),要么就应该避免发生(RuntimeException)。如果方法没有声明所有可能发生的已检查异常,编译器就会给出一个错误消息。
捕获异常
如果某个异常发生的时候没有进行捕获,那程序就会终止执行,并在控制台上打印出异常信息,其中包括异常的类型和堆栈的内容。要想捕获一个异常,必须设置try/catch语句块。最简单的try语句块如下所示:
try {
code
more code
more code
} catch (ExceptionType e) {
handler for this type
}
如果在try语句块中的任何代码抛出了一个在catch自娱中说明的异常类,那么
1)程序将跳过try语句块的其余代码。
2)程序将执行catch字句中的处理器代码。
如果在try语句块中的代码没有抛出任何异常,那么程序将跳过catch子句。
如果方法中的任何代码抛出了一个在catch子句中没有声明的异常类型,那么这个方法就会立刻退出。
通常捕获哪些知道如何处理的异常,而将那些不知道如何处理的异常继续进行传递。如果想传递一个异常,就必须在方法的首部添加一个throws说明符,以便告知调用者这个方法可能会抛出异常。
捕获多个异常
在一个try语句块中可以捕获多个异常类型,并对不同类型的异常做出不同的处理。可以按照下列方式为每个异常类型使用一个单独的catch子句:
try {
code that might throw exceptions
} catch (FileNotFoundException e) {
emergency action for missing files
} catch (UnknownHostException e) {
emergency action for unknown hosts
} catch (IOException e) {
emergency action for all other I/O problems
}
在Java SE7中,同一个catch子句中可以捕获多个异常类型。例如,假设对应缺少文件和异常未知主机异常的动作是一样的,就可以合并catch子句:
try {
code that might throw exception
} catch (FileNotFoundException | UnknownHostException e) {
emergency action for missing files and unknown hosts
} catch (IOException e) {
emergency action for all other I/O problems
}
只有当捕获的异常类型彼此之间不存在子类关系时才需要这个特性。
捕获所有异常
可以只写一个异常处理程序来捕获所有类型的异常。通过捕获异常类型的基类Exception,就可以做到这一点(事实上还有其他的基类,但Exception是同编程活动相关的基类):
catch(Exception e) {
System.out.println("Caught an exception");
这将捕获所有异常,所以最好把它放在处理程序表的末尾,以防它抢在其他处理程序之前就把异常捕获了。
再次抛出异常与异常链
在catch子句中可以抛出一个异常,这样做的目的是改变异常的类型。如果开发了一个供其他程序员使用的子系统,那么,用于表示子系统故障的异常类型可能会产生多种解释。ServletException就是这样一个异常类型的例子。执行servlet的代码可能不想知道发射给你错误的细节原因,但希望明确地知道servlet是否有问题。
下满给出了捕获异常并将它再次抛出的基本方法:
try {
access the database;
} catch (SQLException e) {
throw new ServletException("..")
}
finally子句
不管是否有异常被捕获,finally子句中的代码都被执行。
【Java】 异常的更多相关文章
- 浅谈java异常[Exception]
学习Java的同学注意了!!! 学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:589809992 我们一起学Java! 一. 异常的定义 在<java编程思想 ...
- 基础知识《十》java 异常捕捉 ( try catch finally ) 你真的掌握了吗?
本文转载自 java 异常捕捉 ( try catch finally ) 你真的掌握了吗? 前言:java 中的异常处理机制你真的理解了吗?掌握了吗?catch 体里遇到 return 是怎么处理 ...
- Java异常体系及分类
上图是基本的java异常体系结构. 主要分为2大类:Error和Exception 1.Error:描述了Java运行系统中的内部错误以及资源耗尽的情形.应用程序不应该抛出这种类型的对象,一般是由虚拟 ...
- Java异常之自定义异常
哎呀,妈呀,又出异常了!俗话说:"代码虐我千百遍,我待代码如初恋". 小Alan最近一直在忙着工作,已经很久没有写写东西来加深自己的理解了,今天来跟大家聊聊Java异常.Java异 ...
- 第11章 Java异常与异常处理
1.Java异常简介 1.什么是异常异常出现的时候代码会无法正常运行下去,会产生各种问题2.捕捉异常的作用提早发现异常,方便查找问题,并给出解决方法3.Java中的异常1.Java中所有不正常的类都是 ...
- java 异常
1.java异常 2.自定义抛出 3.运行时异常,程序有问题,让使用者可以改' ' 4.return 和 throw的区别 return 符合函数要求的值 throw 有问题的时候用它结束 ...
- 3.Java异常进阶
3.JAVA异常进阶 1.Run函数中抛出的异常 1.run函数不会抛出异常 2.run函数的异常会交给UncaughtExceptionhandler处理 3.默认的UncaughtExceptio ...
- 2.Java异常学习
1.Java异常的概念 异常的例子 1.除法就是一个需要捕获异常的例子,除数又可能是0 异常处理的基本流程如下 一旦发生异常,就使得程序不按照原来的流程继续的运行下去 a.程序抛出异常 try{ th ...
- java异常架构图 和几个面试题
1.java异常架构图 粉红色的是受检查的异常(checked exceptions),其必须被 try{}catch语句块所捕获,或者在方法签名里通过throws子句声明.受检查的异常必须在编译时被 ...
- 黑马----JAVA异常
黑马程序员:Java培训.Android培训.iOS培训..Net培训 黑马程序员--JAVA异常 一.JAVA异常有三种语句块:try语句块.catch语句块.finally语句块. 1.try语句 ...
随机推荐
- mysql 数据库表备份和还原
#!/bin/bash #ip地址 HOST=localhost #用户名 USER=claim #密码 PASSWORD=Pw123456! #数据库名称 DATABASE=claim_oauth2 ...
- Android学习之基础知识十三 — 四大组件之服务详解第一讲
一.服务是什么 服务(Service)是Android中实现程序后台运行的解决方案,它非常适合去执行那些不需要和用户交互而且还要求长期运行的任务.服务的运行不依赖于任何用户界面,即使程序被切换到后台, ...
- Apache IOUtils的使用
IOUtils 与 FileUtilsCommons IO 是 apache 的一个开源的工具包,封装了 IO操作的相关类,使用 Commons IO 可以很方便的读写文件 commons.jar 包 ...
- Android2.3系统 自定义的PopupWindow在实例化时报空指针异常
情况:是这样的,前段时间做了一个自定义的PopupWindow,就是写一个类,然后继承PopupWindow,别的什么操作都没有,但是在实例化的时候,在2.3系统中直接就报空指针异常(4.0及以上系统 ...
- wifidog源码分析 - wifidog原理
wifidog是一个用于配合认证服务器实现无线网页认证功能的程序,常见的情景就是使用于公共场合的无线wifi接入点,首先移动设备会连接公共wifi接入点,之后会弹出网页要求输入用户名密码,认证过后才能 ...
- Iterable接口
Iterable接口 总览 这个接口用来表明可以进行迭代.具体的迭代方式,可以通过iterator()方法获取到一个迭代器,在迭代器中会实现如何获取下一个元素,以及是否迭代结束. java8中源码如下 ...
- JSON WEB TOKEN,简单谈谈TOKEN的使用及在C#中的实现
十年河东,十年河西,莫欺少年穷. 学无止境,精益求精. 突然发现整个十月份自己还没有写一篇博客......哎,说出来都是泪啊,最近加班实在实在实在是太多了,真的没有多余的时间写博客.这不,今天也在加班 ...
- 阿里Java面经大全(整合版)
本文里的面经内容全部来源于牛客网,作为秋招备战复习与查缺补漏时使用.里面部分面经有我的注释和想法,以及部分解答,不一定正确,大家可以查询补充. 阿里巴巴,三面,java实习 昨天晚上11点打电话来,问 ...
- VS2015 搭建 Asp.net core 开发环境
1.首先你得装个vs2015 并且保证已经升级至 update3及以上(此处附上一个vs2015带up3的下载链接: ed2k://|file|cn_visual_studio_enterprise_ ...
- Linux常用命令行
实时查看日志runtime.log最后100行 tail -f -n 100 runtime.log