*Java* 异常

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

类型不存在异常  当应用试图


你可能感兴趣的:(java,多线程,编程,虚拟机,项目管理)