其实,异常很久以前就遇到了,一直没整理。对异常的理解还需提高。
写程序和生活中的情况很相似,会遇到一些异常情况。有些异常能预料到,在程序执行中可能突然发生,可以防患于未然;有些则无法预料。
以下是部分异常继承:
[img]http://dl.iteye.com/upload/attachment/434692/fcaffff9-4080-3ecc-b951-757e9605ee04.jpg[/img]
1.Exception:程序本身可以处理的异常。发生异常,则可以处理。
2.Error:违反基本原则,由Java虚拟机抛出。如内存空间不足OutofMemory,Java虚拟机的方法调用栈溢出StackOutofMemoryError。出现异常,终止程序执行。
Exception:可分为运行时异常和受检查异常。
1.1RuntimeException:运行时异常。编译时,不需强制检查异常。用户可根据特定问题创建相关的运行时异常类。一般由于代码错误,执行了错误的操作,引起的异常。
1.2除RuntimeException以及它的子类,其他的Exception类及其子类都属于受检查异常(Checked Exception)。
处里异常,有两种方法。
(1)try……catch捕获并处理异常
(2)throws,方法的声明处通过throws语句声明抛出异常。
这个方法没有能力处理异常,所以抛出异常,交给上一层方法处理。
throws 与 throw区别:
throws:在声明方法处,方法 throws 异常类名。
throw:语句执行中使用throw。对象必须为java.lang.Throwable类或其子类的实例。
属于Error异常类,定义的数组大小超过了虚拟机总共可分配的内存。
RuntimeException运行异常,空指针异常,没有指向指定的内存单元,即没有创建对象。这目前在程序中比较常见。
由于处理异常,目前使用的不多,所以,以下几句以后慢慢体会了。
1.出现异常,使用try……catch时,虚拟机搜索方法调用栈来寻找异常处理代码块,如果抛出异常的代码块和处理异常的代码块相隔很多层,找的时间就多了。
2.避免过于庞大的try代码块。代码块越大,出现异常的情况就越多,分析发生异常的原因就越困难。
3.catch()中指定具体的异常类型。因为不同的异常执行不同的处理。
写程序和生活中的情况很相似,会遇到一些异常情况。有些异常能预料到,在程序执行中可能突然发生,可以防患于未然;有些则无法预料。
以下是部分异常继承:
[img]http://dl.iteye.com/upload/attachment/434692/fcaffff9-4080-3ecc-b951-757e9605ee04.jpg[/img]
1.Exception:程序本身可以处理的异常。发生异常,则可以处理。
2.Error:违反基本原则,由Java虚拟机抛出。如内存空间不足OutofMemory,Java虚拟机的方法调用栈溢出StackOutofMemoryError。出现异常,终止程序执行。
Exception:可分为运行时异常和受检查异常。
1.1RuntimeException:运行时异常。编译时,不需强制检查异常。用户可根据特定问题创建相关的运行时异常类。一般由于代码错误,执行了错误的操作,引起的异常。
1.2除RuntimeException以及它的子类,其他的Exception类及其子类都属于受检查异常(Checked Exception)。
处里异常,有两种方法。
(1)try……catch捕获并处理异常
try {
//可能发生异常的语句
}catch(){
//捕捉并处理异常,中断try中的正常流程,
}finally{
//无论是否有异常,总是会执行的语句,释放被占用的相关资源
}
finally中的语句放try……catch后面,某些情况也能执行,但如果catch中继续抛出异常,则导致catch所在的方法异常终止,就不执行try……catch后面的语句了。
(2)throws,方法的声明处通过throws语句声明抛出异常。
这个方法没有能力处理异常,所以抛出异常,交给上一层方法处理。
throws 与 throw区别:
throws:在声明方法处,方法 throws 异常类名。
throw:语句执行中使用throw。对象必须为java.lang.Throwable类或其子类的实例。
public static void main(String[] args) {
testException te=new testException();
te.testArray();
}
public void testArray(){
int[] b=new int[61862000];//超过虚拟机分配内存
System.out.println("整型数组创建成功");
}
java.lang.OutOfMemoryError: Java heap space
属于Error异常类,定义的数组大小超过了虚拟机总共可分配的内存。
public void testNullPointer(){
String ss=null;
ss.getBytes();
System.out.println("调用成功");
}
java.lang.NullPointerException
RuntimeException运行异常,空指针异常,没有指向指定的内存单元,即没有创建对象。这目前在程序中比较常见。
public static void main(String[] args) {
testException te=new testException();
try{
te.throwAgain();
}catch(Exception ef){
ef.printStackTrace();
System.out.println("处理异常了");
}
}
public void throwAgain() throws Exception{
try{
testThrow(-5);
}catch(Exception ef){
ef.printStackTrace();//无此句,则执行后,不显示出现异常的地方
throw new Exception("此方法无法处理,继续throw给上层");
}finally{
System.out.println("finally中语句总是执行");
}
System.out.println("finally之后的语句执行了");
}
//创建5个单元的数组
public void testThrow(int num){
if (num<0){
throw new IllegalArgumentException("个数不能小于0");
}
int a[]=new int [5];
System.out.println("创建数组成功");
}
若throw,则后面的语句就不执行了,回到上一层调用的函数。testThrow,回到throwAgain,然后处理上一个函数抛出的异常,由于throwAgain无法处理异常,所以继续上抛异常,此时,try……catch之后的语句就不执行了,最后在main函数里处理了。
由于处理异常,目前使用的不多,所以,以下几句以后慢慢体会了。
1.出现异常,使用try……catch时,虚拟机搜索方法调用栈来寻找异常处理代码块,如果抛出异常的代码块和处理异常的代码块相隔很多层,找的时间就多了。
2.避免过于庞大的try代码块。代码块越大,出现异常的情况就越多,分析发生异常的原因就越困难。
3.catch()中指定具体的异常类型。因为不同的异常执行不同的处理。