JAVA里的异常
一、概念和分类
JAVA程序设计语言中,异常对象都是Throwable类的一个实例。Throwable分为Error和Exception。

其中,Error类层次结构描述了JAVA运行时系统的内部错误和资源耗尽错误,这种错误无法操作。在设计JAVA程序时,我们只需要关注Exception。
Exception包含两个分支:
- RuntimeException
- 其他异常。
划分两个分支的规则是:由程序错误导致的异常属于RuntimeException;而程序本身没有问题,但由于I/O错误这类问题导致的异常属于其他异常。
RuntimeException即是运行时异常,即在程序运行的时候才出现的异常,又称“未检查异常”,意即“编译器未检查出的异常”。
其他异常称为“已检查异常”。
派生于RuntimeException的异常包含下面几种情况:
- 错误的类型转换。
- 数组访问越界
- 访问空指针
其他异常包括:
- 试图在文件发问后面读取数据
- 试图打开一个不存在的文件。
- 试图根据给定的字符串查找Class对象,而这个字符串表示的类并不存在。
二、异常的声明
在JAVA的方法里,如果可能遇到无法处理的情况,比如要打开的文件并不存在,这时就要声明异常。声明异常的方法是在方法的首部声明所有可能抛出的异常。比如标准类库中的FileInputStream类的一个构造器的声明:

一个方法必须声明所有可能抛出的已检查异常(Exception中RuntimeException之外的其他异常),而未检查异常要么不可控制(Error),要么就应该避免发生(RuntimeException)。
如果一个方法没有声明所有可能发生的已检查异常,编译器就会报错。
三、异常的抛出
异常的抛出使用“throw”关键字,比如一个方法可能出现EOFException,我们希望它抛出这个异常,可以用下面的语句:
throw new EOFExcetion();
或:
EOFExcetion e = new EOFException();
throw e;
如果一个方法里使用了throw关键字抛出了一个异常,并且这个异常又不是RuntimeException,那么必须在方法首部用throws声明这个异常。
如果一个方法用throws声明了一个异常,那么调用这个方法的方法就必须对这个异常进行捕获,或者继续声明。(这个有一点例外,如果父类方法中没有声明异常,那么子类在覆盖父类这个方法的时候也不能声明异常,见JComponent.paintComponent方法)
四、创建异常类
有时候我们可能会遇到所有标准异常类都无法准确处理的问题,比如
int age = -1;
这行代码本身没有什么问题,但是实际上年龄不可能为负数。这个时候我们就需要自己来创建一个异常类:


五、异常的捕获
如果某个异常没有在任何地方进行捕获,那么程序就会终止执行,并在控制台上打印出异常信息,其中包括异常的类型和堆栈和内容。
要想捕获一个异常,必须设置 try/catch 语句块:
try{
someCode;
}catch(ExceptionType e){
handle for this Exception;
}
- 如果在try语句块中的任何代码抛出了一个在catch子句中有被说明的异常类,那么程序将跳过try语句块的其余代码,并且执行catch子句中的处理代码。
- 如果在try语句块中的代码没有抛出任何异常,那么程序将跳过catch语句。
- 如果方法中的任何代码抛出了一个在catch子句中没有声明的异常类型,那么这个方法就会立刻退出。
JAVA里的异常的更多相关文章
- Java 里的异常(Exception)详解
作为一位初学者, 本屌也没有能力对异常谈得很深入. 只不过Java里关于Exception的东西实在是很多. 所以这篇文章很长就是了.. 一, 什么是java里的异常 由于java是c\c++ ...
- Java 中的异常和处理详解
Java 中的异常和处理详解 原文出处: 代码钢琴家 简介 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常.异常发生时,是任程序自生自灭,立刻退出终止,还是输出错误 ...
- Core Java 总结(异常类问题)
所有代码均在本地编译运行测试,环境为 Windows7 32位机器 + eclipse Mars.2 Release (4.5.2) 2016-10-17 整理 下面的代码输出结果是多少?为什么?并由 ...
- 【Java心得总结二】浅谈Java中的异常
作为一个面向对象编程的程序员对于 下面的一句一定非常熟悉: try { // 代码块 } catch(Exception e) { // 异常处理 } finally { // 清理工作 } 就是面向 ...
- 关于java中的异常问题 1
1.首先参考一下关于java异常处理方面的知识 查看博客http://lavasoft.blog.51cto.com/62575/18920/ 这里介绍的很好,下面从中学习到一些东西,摘抄如下: 1. ...
- [Effective Java]第九章 异常
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- 点评阿里JAVA手册之异常日志(异常处理 日志规约 )
下载原版阿里JAVA开发手册 [阿里巴巴Java开发手册v1.2.0] 本文主要是对照阿里开发手册,注释自己在工作中运用情况. 本文内容:异常处理 日志规约 本文难度系数为一星(★) 本文为第三篇 ...
- (转)Java里的堆(heap)栈(stack)和方法区(method)(精华帖,多读读)
[color=red][/color]<一> 基础数据类型直接在栈空间分配, 方法的形式参数,直接在栈空间分配,当方法调用完成后从栈空间回收. 引用数据类型,需要用new来创建,既在栈 ...
- java.util.ConcurrentModificationException 异常问题详解
环境:JDK 1.8.0_111 在Java开发过程中,使用iterator遍历集合的同时对集合进行修改就会出现java.util.ConcurrentModificationException异常, ...
随机推荐
- lua代码设置unity对象的基础属性
设置对象的父节点: wall.transform:SetParent(GameObject.Find("Walls").transform) 设置颜色: wall:GetCompo ...
- 干货|宏巍软件之Java线程监控之旅
宏巍软件 许向 大家好,我是上海宏巍信息技术有限公司(简称:宏巍软件)的许向,宏巍软件成立于2005年,是一家以电商ERP软件开发为主的高新技术科技型软件公司,致力于为大型网商和电子商务企业提供专业. ...
- C# IntPtr转换为Byte[]
[DllImport("OpenNetStream.dll")] public static extern int OpenSDK_Data_GetDevList(IntPtr s ...
- 创建并追加img元素(jquery!)
有几种方法 但都需要你指定一个节点 根据这个节点进行添加 如现有一节点Id为pr:一,向该节点内部后方添加:1 $("#pr").append("<img src= ...
- shell 中scp密码输入 --expect
这里必须先安装: yum install expect -y expect是一种自动交互语言,能实现在shell脚本中为scp和ssh等自动输入密码自动登录. 下面给出scp和ssh的使用示例: 1. ...
- git 常见命令
查看.添加.提交.删除.找回,重置修改文件 git help <command> # 显示command的help git show # 显示某次提交的内容 git show $id gi ...
- Mac 安装mysql5.7 注意事项
下载与安装 去mysql官网(http://dev.mysql.com/downloads/mysql/)下载自己Mac相对应 MySQL Community 下载下来接压之后你会发现mysql就 ...
- Linux新建用户无法使用tab补全的修改办法
原因: Root用的是/bin/bash 新增用户默认用的是/bin/sh,用ls -l /bin/sh发现 ->dash,修改下连接即可正常使用:
- Gson实现自定义解析json格式
客户端跟服务器交互的时候我们使用json实现 但是 在交互的时候除了传送json对象数据意外 我们还需要传输标志位等 比如我们现在的交互方式格式 对象 { "data": { &q ...
- jsp中,个别乱码进行转码操作
来自大神 if(xh!=null && xh!=""){ xhmc =new String(xh.getBytes("ISO-8859-1"), ...