java 异常
[size=medium][/size]
------总结 :异常这块 当时听完课 含糊些 感觉明白了些 查查 写写小总结(用自己的含糊语)
但当再次遇到Exception时还是傻眼些 自己感觉有很大的必要自己的总结+拷贝
一个程序的健壮性可读性准确性和稳定性和可维护都在程序的异常处理的好坏 所以还是花点
时间“拷贝”一下:平时多喵喵 oops:----
平时在程序中时常会遇到很多问题 经常会出现程序报错 只要运行就出现错误
这种错误在java异常中被称为异常(Exception) 这种错误处理称为异常处理
异常处理Java语言中的一种机制 巧用异常处理 使得你的代码更加稳定 正确 方便阅读和
维护
在一个完善的项目 这些不可预料的情况必须得到正确的处理 才能使整个项目具有比较强的
稳定性 这才是符合要求的项目 为了实现这种处理结构 在Java语言中新增了一套完善的
语法 通过处理这些情况来增强项目的稳定性 这套语法就是异常处理的语法。
在Java中的异常用对象来表示 Java对异常的处理是按异常分类处理的 不同异常有不同分
类 每种异常都对应一个类型(class) 每个异常都对应一个异常(类的)
对象 异常类从哪里来? 有两个来源 “一”是 Java语言本身定义的一些基本异常类型
“二”是用户通过继承Exception类或者其子类自己定义的异常 Exception 类及其子类
是 Throwable 的一种形式 它指出了合理的应用程序想要捕获的条件。
异常的对象从哪里来呢? 有两个来源 “一”是Java运行时环境自动抛出 系统生成的异
常而不管你是否愿意捕获和处理,它总要被抛出!比如除数为0的异常 二是程序员自己抛
出的异常 这个异常可以是程序员自己定义的 也可以是Java语言中定义的 用throw 关键
字抛出异常 这种异常常用来向调用者汇报异常的一些信息 异常是针对方法来说的 抛
出声明抛出 捕获和处理 异常都是在方法中进行的
Java异常处理通过5个关键字try catch throw throws finally进行管理
基本过程是用try语句块包住要监视的语句 如果在try语句块内出现异常 则异常会被抛出,
你的代码在 catch语句块中可以捕获到这个异常并做处理 还有以部分系统生成的异常在
Java运行时自动
抛出 你也可以通过throws关键字在方法上声明该方法要抛出异常,然后在方法内部通过
throw抛出异常对象 finally语句块会在方法执行return之前执行 如:
try{
程序代码
}catch(异常类型1 异常的变量名1){
程序代码
}catch(异常类型2 异常的变量名2){
程序代码
}finally{
程序代码
}
{{ catch语句可以有多个 用来匹配多个异常 匹配上多个中一个 后执行catch语句块时候
仅仅执行匹配上的异常 catch的类型是Java语言中定义的或者程序员自己定义的 表示代
码抛出异常的类型 异常的变量名表示抛出异常的对象的引用 如果catch捕获并匹配上了该
异常 那么就可以直接用这个异常变量名 此时该异常变量名指向所匹配的异常 并且在
catch代码块中可以直接引用 这一点非常非常的特殊和重要!}}
Java异常处理的目的是提高程序的健壮性,你可以在catch和finally代码块中给程序一个
修正机会使得程序不因异常而终止或者流程发生以外的改变。
对于可能出现异常的代码,有两种处理办法:
第一 在方法中用try...catch语句捕获并处理异常 catach语句可以有多个 用来匹配多个
异常 例如
:
public void p(int x){
try{
...
}catch(Exception e){
...
}finally{
...
}
}
第二 对于处理不了的异常或者要转型的异常 在方法的声明处通过throws语句抛出异常 例如:public
void test1() throws MyException{
...
if(....){
throw new MyException();
}
}
如果每个方法都是简单的抛出异常 那么在方法调用方法的多层嵌套调用中 Java虚拟机会
从出现
异常的方法代码块中往回找 直到找到处理该异常的代码块为止 然后将异常交给相应的
catch语句处理
如果Java虚拟机追溯到方法调用栈最底部main()方法时 如果仍然没有找到处理异常的代码
块 将按照下面
的步骤处理:
try语句不能单独存在 可以和catch finally组成 try...catch...finally、try...catch try...finally
三种结构 catch语句可以有一个或多个 finally语句最多一个 try、catch、finally
这三个关键字均不能单独使用
第二 try、catch、finally三个代码块中变量的作用域分别独立而不能相互访问
如果要在三个块中都可以访问,则需要将变量定义到这些块的外面
第三 多个catch块时候 Java虚拟机会匹配其中一个异常类或其子类 就执行这个catch
块 而不会再执行别的catch块
第四 throw语句后不允许有紧跟其他语句 因为这些没有机会执行
第五 如果一个方法调用了另外一个声明抛出异常的方法 那么这个方法要么处理异常 要么声
明抛出 那怎么判断一个方法可能会出现异常呢? 一般来说方法声明的时候用了throws语
句 方法中有throw语句 方法调用的方法声明有throws关键字
throw和throws关键字的区别
throw用来抛出一个异常 在方法体内 语法格式为: throw 异常对象
throws用来声明方法可能会抛出什么异常 在方法名后 语法格式为:throws 异常类型1
异常类型2...异常类型n
throws 用于抛出方法层次的异常 并且直接由些方法调用异常处理类来处理该异常 所以
它常用在方法的后面 比如
public static void main(String[] args) throws SQLException
throw 用于方法块里面的代码 比throws的层次要低 比如try...catch ....语句
块 表示它抛出异常 但它不会处理它
而是由方法块的throws Exception来调用异常处理类来处理
throw用在程序中 明确表示这里抛出一个异常
throws用在方法声明的地方 表示这个方法可能会抛出某异常
throw是抛出一个具体的异常类 产生一个异常
throws则是在方法名后标出该方法会产生何种异常需要方法的使用者捕获并处理
异常类的 java api 文档
0--Throwable
Throwable 类是 Java 语言中所有错误或异常的超类 只有当对象是此类(或其子类之
一的实例时才能通过 Java 虚拟机或者 Java throw 语句抛出 类似地 只有此类或其
子类之一才可以是 catch 子句中的参数类型 两个子类的实例 Error 和 Exception
通常用于指示发生了异常情况 通常 这些实例是在异常情况的上下文中新近创建的 因此包
含了相关的信息(比如堆栈跟踪数据)。
1-- Error类
该类代表错误 指程序无法恢复的异常情况 对于所有错误类型以及其子类 都不要求程序进行
处理 常见的Error类 例如内存溢出StackOverflowError等
Error 是 Throwable 的子类 表示仅靠程序本身无法恢复的严重错误 用于指示合理的应
用程序不应该试图捕获的严重问题 在执行该方法期间 无需在方法中通过throws声明可能
抛出但没有捕获的 Error 的
任何子类 因为Java编译器不去检查它 当程序中可能出现这类异常时 即使没有用
try...catch语句捕获它 也没有用throws 字句声明抛出它 还是会编译通过
2-- Exception类
及其子类是 Throwable 的一种形式 它指出了合理的应用程序想要捕获的条件,表示程
序本身可以处理的异常
该类代表异常 指程序有可能恢复的异常情况 该类就是整个Java语言异常类体系中的父类
使用该类 可以代表所有异常的情况 在Java API中 声明了几百个Exception的子类分别
来代表各种各样的常见异常情况 这些类根据需要代表的情况位于不同的包中 这些类的类名
均以Exception作为类名的后缀 如 遇到的异常情况 Java API中没有对应的异常类进行
代表 也可以声明新的异常类来代表特定的情况 在这些异常类中 根据是否是程序自身导致
的异常 将所有的异常类分为两种:
1 RuntimeException及其所有子类
该类异常属于程序运行时异常 也就是由于程序自身的问题导致产生的异常 例如数组下标越
界异常ArrayIndexOutOfBoundsException等 该类异常在语法上不强制程序员必须处理
即使不处理这样的异常也不会出现语法错误。
RuntimeException 是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类
Java编译器不去检查它 也就是说 当程序中可能出现这类异常时 即使没有用
try...catch语句 捕获它 也没有用throws字句声明抛出它 还是会编译通过 这种异常可以
通过改进代码实现来避免
2 其它Exception子类
该类异常属于程序外部的问题引起的异常 也就是由于程序运行时某些外部问题导致产生的异
常 例如文件不存在异常FileNotFoundException等。
该类异常在语法上强制程序员必须进行处理 如果不进行处理则会出现语法错误。
熟悉异常类的分类 将有助于后续语法中的处理 也使得在使用异常类时可以选择恰当的异常
类类型
3、ThreadDeath
调用 Thread 类中带有零参数的 stop 方法时 受害线程将抛出一个 ThreadDeath 实
例 仅当应用程序在被异步终止后必须清除时才应该捕获这个类的实例 如果 ThreadDeath
被一个方法捕获 那么将它重新抛出非常重要 因为这样才能让该线程真正终止 如果没有捕
获 ThreadDeath 则顶级错误处理 程序不会输出消息 虽然 ThreadDeath 类是
“正常出现”的 但它只能是 Error 的子类而不是
Exception 的子类 因为许多应用程序捕获所有出现的 Exception 然后又将其放
弃 以上是对有关异常API的一个简单介绍 用法都很简单 关键在于理解异常处理的原
理 具体用法参看Java API文档
Throwable 文档
Throwable (Java 2 Platform SE 5.0)
http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/java/lang/Throwable.html
常见的异常 (拷贝的 呵呵O(∩_∩)O~)
1. java.lang.nullpointerexception
这个异常大家肯定都经常遇到 异常的解释是"程序遇上了空指针" 简单地说就是调用了未
经初始化的对象或者是不存在的对象 这个错误经常出现在创建图片 调用数组这些操作中
比如图片未经初始化 或者图片创建时的路径错误等等 对数组操作中出现空指针 很多情况
下是一些刚开始学习编程的朋友常犯的错误 即把数组的初始化和数组元素的初始化混淆起来
了 数组的初始化是对数组分配需要的空间 而初始化后的数组 其中的元素并没有实例化
依然是空的 所以还需要对每个元素都进行初始化(如果要调用的话)
2. java.lang.classnotfoundexception
这个异常是很多原本在jb等开发环境中开发的程序员 把jb下的程序包放在wtk下编译经常出
现的问题 异常的解释是"指定的类不存在" 这里主要考虑一下类的名称和路径是否正确即
可 如果是在jb下做的程序包 一般都是默认加上package的 所以转到wtk下后要注意把
package的路径加上
3. java.lang.arithmeticexception
这个异常的解释是"数学运算异常" 比如程序中出现了除以零这样的运算就会出这样的异常
对这种异常 大家就要好好检查一下自己程序中涉及到数学运算的地方 公式是不是有不妥
了
4. java.lang.arrayindexoutofboundsexception
这个异常相信很多朋友也经常遇到过 异常的解释是"数组下标越界",现在程序中大多都有
对数组的操作 因此在调用数组的时候一定要认真检查 看自己调用的下标是不是超出了数组
的范围 一般来说 显示(即直接用常数当下标)调用不太容易出这样的错 但隐式(即用变
量表示下标)调用就经常出错了 还有一种情况 是程序中定义的数组的长度是通过某些特定
方法决定的 不是事先声明的 这个时候 最好先查看一下数组的length,以免出现这个异常。
5. java.lang.illegalargumentexception
这个异常的解释是"方法的参数错误" 很多j2me的类库中的方法在一些情况下都会引发这样
的错误 比如音量调节方法中的音量参数如果写成负数就会出现这个异常 再比如
g.setcolor(int red,int green,int blue)这个方法中的三个值 如果有超过255的也
会出现这个异常 因此一旦发现这个异常 我们要做的 就是赶紧去检查一下方法调用中的参
数传递是不是出现了错误。
6. java.lang.illegalaccessexception
这个异常的解释是"没有访问权限" 当应用程序要调用一个类
但当前的方法即没有对该类的访问权限便会出现这个异常 对程序中用了package的情况下要注意这个异常
其他还有很多异常 要说明的是 一个合格的程序员 需要对程序中常见的问题有相当的
了解和相应的解决办法 否则仅仅停留在写程序而不会改程序的话 会极大影响到自己的开发
的 关于异常的全部说明 在api里都可以查阅
算术异常类:ArithmeticExecption
空指针异常类:NullPointerException
类型强制转换异常:ClassCastException
数组负下标异常:NegativeArrayException
数组下标越界异常:ArrayIndexOutOfBoundsException
违背安全原则异常:SecturityException
文件已结束异常:EOFException
文件未找到异常:FileNotFoundException
字符串转换为数字异常:NumberFormatException
操作数据库异常:SQLException
输入输出异常:IOException
方法未找到异常:NoSuchMethodException
java.lang.AbstractMethodError
抽象方法错误。当应用试图调用抽象方法时抛出。
java.lang.AssertionError
断言错。用来指示一个断言失败的情况。
java.lang.ClassCircularityError
类循环依赖错误。在初始化一个类时 若检测到类之间循环依赖则抛出该异常。
java.lang.ClassFormatError
类格式错误 当Java虚拟机试图从一个文件中读取Java类 而检测到该文件的内容不符合类的有效格式时抛出
java.lang.Error
错误 是所有错误的基类 用于标识严重的程序运行问题。这些问题通常描述一些不应被应用程序捕获的反常情况
java.lang.ExceptionInInitializerError
初始化程序错误 当执行一个类的静态初始化程序的过程中 发生了异常时抛出 静态初始化程序是指直接包含于类中的static语句段
java.lang.IllegalAccessError
违法访问错误 当一个应用试图访问 修改某个类的域(Field)或者调用其方法 但是又违反域或方法的可见性声明 则抛出该异常
java.lang.IncompatibleClassChangeError
不兼容的类变化错误 当正在执行的方法所依赖的类定义发生了不兼容的改变时 抛出该异常 一般在修改了应用中的某些类的声明定义而没有对整个应用重新编译而直接运行的情况下 容易引发该错误
java.lang.InstantiationError
实例化错误 当一个应用试图通过Java的new操作符构造一个抽象类或者接口时抛出该异常
java.lang.InternalError
内部错误 用于指示Java虚拟机发生了内部错误
java.lang.LinkageError
链接错误 该错误及其所有子类指示某个类依赖于另外一些类 在该类编译之后 被依赖的类改变了其类定义而没有重新编译所有的类 进而引发错误的情况
java.lang.NoClassDefFoundError
未找到类定义错误 当Java虚拟机或者类装载器试图实例化某个类 而找不到该类的定义时抛出该错误
java.lang.NoSuchFieldError
域不存在错误 当应用试图访问或者修改某类的某个域 而该类的定义中没有该域的定义时抛出该错误
java.lang.NoSuchMethodError
方法不存在错误 当应用试图调用某类的某个方法 而该类的定义中没有该方法的定义时抛出该错误
java.lang.OutOfMemoryError
内存不足错误 当可用内存不足以让Java虚拟机分配给一个对象时抛出该错误
java.lang.StackOverflowError
堆栈溢出错误 当一个应用递归调用的层次太深而导致堆栈溢出时抛出该错误
java.lang.ThreadDeath
线程结束 当调用Thread类的stop方法时抛出该错误 用于指示线程结束
java.lang.UnknownError
未知错误 用于指示Java虚拟机发生了未知严重错误的情况
java.lang.UnsatisfiedLinkError
未满足的链接错误 当Java虚拟机未找到某个类的声明为native方法的本机语言定义时抛出
java.lang.UnsupportedClassVersionError
不支持的类版本错误 当Java虚拟机试图从读取某个类文件 但是发现该文件的主 次版本号不被当前Java虚拟机支持的时候 抛出该错误
java.lang.VerifyError
验证错误 当验证器检测到某个类文件中存在内部不兼容或者安全问题时抛出该错误
java.lang.VirtualMachineError
虚拟机错误 用于指示虚拟机被破坏或者继续执行操作所需的资源不足的情况
java.lang.ArithmeticException
算术条件异常 譬如:整数除零等
java.lang.ArrayIndexOutOfBoundsException
数组索引越界异常 当对数组的索引值为负数或大于等于数组大小时抛出
java.lang.ArrayStoreException
数组存储异常 当向数组中存放非数组声明类型对象时抛出
java.lang.ClassCastException
类造型异常 假设有类A和B(A不是B的父类或子类) O是A的实例 那么当强制将O构造为类B的实例时抛出该异常 该异常经常被称为强制类型转换异常
java.lang.ClassNotFoundException
找不到类异常 当应用试图根据字符串形式的类名构造类 而在遍历CLASSPAH之后找不到对应名称的class文件时,抛出该异常
java.lang.CloneNotSupportedException
不支持克隆异常 当没有实现Cloneable接口或者不支持克隆方法时 调用其clone()方法则抛出该异常
java.lang.EnumConstantNotPresentException
枚举常量不存在异常 当应用试图通过名称和枚举类型访问一个枚举对象 但该枚举对象并不包含常量时,抛出该异常
java.lang.Exception
根异常 用以描述应用程序希望捕获的情况
java.lang.IllegalAccessException
违法的访问异常 当应用试图通过反射方式创建某个类的实例、访问该类属性 调用该类方法 而当时又无法访问类的 属性的 方法的或构造方法的定义时抛出该异常
java.lang.IllegalMonitorStateException
违法的监控状态异常 当某个线程试图等待一个自己并不拥有的对象(O)的监控器或者通知其他线程等待该对象(O)的监控器时 抛出该异常
java.lang.IllegalStateException
违法的状态异常 当在Java环境和应用尚未处于某个方法的合法调用状态 而调用了该方法时 抛出该异常
java.lang.IllegalThreadStateException
违法的线程状态异常 当县城尚未处于某个方法的合法调用状态 而调用了该方法时 抛出异常
java.lang.IndexOutOfBoundsException
索引越界异常 当访问某个序列的索引值小于0或大于等于序列大小时 抛出该异常
java.lang.InstantiationException
实例化异常 当试图通过newInstance()方法创建某个类的实例 而该类是一个抽象类或接口时 抛出该异常
java.lang.InterruptedException
被中止异常 当某个线程处于长时间的等待 休眠或其他暂停状态 而此时其他的线程通过Thread的interrupt方法终止该线程时抛出该异常
java.lang.NegativeArraySizeException
数组大小为负值异常 当使用负数大小值创建数组时抛出该异常。
java.lang.NoSuchFieldException
属性不存在异常 当访问某个类的不存在的属性时抛出该异常
java.lang.NoSuchMethodException
方法不存在异常 当访问某个类的不存在的方法时抛出该异常
java.lang.NullPointerException
空指针异常 当应用试图在要求使用对象的地方使用了null时 抛出该异常 譬如:调用null对象的实例方法、访问null对象的属性、计算null对象的长度、使用throw语句抛出null等等。
java.lang.NumberFormatException
数字格式异常 当试图将一个String转换为指定的数字类型 而该字符串确不满足数字类型要求的格式时 抛出该异常。
java.lang.RuntimeException
运行时异常 是所有Java虚拟机正常操作期间可以被抛出的异常的父类
java.lang.SecurityException
安全异常 由安全管理器抛出 用于指示违反安全情况的异常。
java.lang.StringIndexOutOfBoundsException
字符串索引越界异常 当使用索引值访问某个字符串中的字符 而该索引值小于0或大于等于序列大小时 抛出该异常。
java.lang.TypeNotPresentException
类型不存在异常 当应用试图