您的位置:首页 > 职场人生

黑马程序员——异常小结

2015-04-12 21:46 211 查看
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一、异常概述

1、异常:程序在运行过程中发生由于硬件设备问题、软件设计错误等导致的程序异常事件。

2、在Java等面向对象的编程语言中,异常本身是一个类,产生异常就是产生了一个异常对象。

3、异常体系图

Throwable

        |——Error :严重的问题,不需要处理的

         |——Exception : 非RuntimeException必须进行处理

                        |——RuntimeException :运行时期异常,需要修正代码

二、异常分类

严重错误,无法通过处理的错误。

运行时异常,运行时可能会报错,可以不处理。如数学异常:ArithmeticException

编译时异常,编译时无法编译通过。如数据格式发生错误:DataFormatException

 

三、异常处理

1、Java默认处理方式:JVM有一个默认的异常处理机制,即将该异常的名称、异常的信息、异常出现的位置打印在了控制台上,同时将程序停止运行。

标准打印流与错误打印流不同步。

2、异常相关操作:

A、创建异常对象(JDK已
4000
定义的异常会自动创建对象,自定义异常需要手动创建)

B、抛出异常(JDK已有定义的异常会自动抛出异常,自定义异常需要手动抛出)

C、处理异常

3、程序员在有异常抛出时,异常的处理方法有两种:

A、将异常捕获并处理

B、声明抛出异常

 

4、将异常捕获并处理:

格式一:try{

需要检测的代码;

}catch(异常类  变量){

异常处理代码;

}

格式二:try{

需要检测的代码;

}catch(异常类  变量){

异常处理代码;

}finally{

必须被执行代码

}

格式三:try{

需要检测的代码;

}finally{

必须被执行代码;

}

 

JDK7的新特性:在处理多个平级的异常的时候

catch(ExceptionA | ExceptionB | ExceptionC ... e) {

}

 

5、多异常捕获处理:

A、分别捕获分别处理,每个try对应一个catch

B、分别捕获分别处理,一个try对应所有catch

注意:大的异常不能在前边捕获

C、一次捕获共同处理

注意:不能同时捕获大的异常与小的异常

 

6、异常常见方法

重写了toString方法

public String getMessage() 返回此 throwable 的详细消息字符串。

public void printStackTrace() 将此 throwable 及其追踪输出至标准错误流

public void printStackTrace(PrintStream s) 将此 throwable 及其追踪输出到指定的输出流。

 

7、声明抛出异常与抛出异常

throws:

用于声明函数抛出异常。用于函数声明。

是异常对象的处理方式之一。

多个异常可以同时声明抛出,用逗号分隔。

throw:

用于抛出异常对象。用于函数内容。

当出现JDK异常对象时,JVM会自动创建一个异常对象并抛出。

自定义异常对象可以先创建异常对象,再使用throw抛出。抛出后再进行处理,或使用捕获或使用声明抛出。

8、自定义异常

A、如果涉及其他需求,JDK没有提供相应的异常对象,则可以自己定义异常。

B、定义格式:继承Exception或者RuntimeException。同时需要带参的构造方法,用于接收异常信息。

class MyException extends Exception{
public MyException(String message){
super(message);
}
}

9、异常处理注意细节

A、运行时异常被抛出可以不处理。即不捕获也不声明抛出。

B、如果父类抛出了多个异常,子类覆盖父类方法时,只能抛出相同的异常或者是他的子集。

C、父类方法没有抛出异常,子类覆盖父类该方法时也不可抛出异常。此时子类产生该异常,只能捕获处理,不能声明抛出。

D、函数中已经出现返回语句返回值A,再在finally中修改A值,则最终的返回值仍为修改前A的值。但在该方法中A的值已经被修改了。

E、finally语句只有在退出虚拟机的情况下不会被执行。

F、不要超出异常捕获处理时的变量作用域。

例一:method方法返回值是:10,number为20
public int method(){
int number = 10;
try{
return number;
}finally{
number = 20;
}
}
例二:
子父关系中的异常处理
class Fu {
public void show()  throws Exception  {

}
}
class Zi extends Fu {
public void show() throws RuntimeException {//只能是Exception或者其子类

}
}
class Demo {
public static void main(String[] args) {

}
}
即:子的重写方法中不能抛出比父更大的异常。

10、如何选择处理方式

A:能够自己处理的时候,尽量自己处理。

B:在main方法里面尽量不要抛。

C:将来在实际开发中,可以把不同的异常给出不同的界面进行显示给用户。

11、面试题:

A、Exception和RuntimeException的区别?

Exception:分为编译期异常和运行期异常。编译期异常是必须处理的。否则,代码不能编译通过。

RuntimeException:运行期异常,不需要编写异常处理代码,但是可能需要修正程序参数或者逻辑代码。

B、final,finally,finalize的特点及区别?

Final:修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载。 

Finally:在异常处理时提供 finally 块来执行任何清除操作,如关闭流,数据库连接等。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。 

Finalize:方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java