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

黑马程序员——Java中的异常处理

2015-10-16 18:39 441 查看
——- android培训java培训、期待与您交流! ———-

异常

指程序在运行时出现的不正常情况(问题),因为问题的产生有产生的原因、有问题的名称、有问题的描述等多个属性信息存在。当出现多属性信息最方便的方式就是将这些信息进行封装。异常就是 java 按照面向对象的思想将问题进行对象封装。这样就方便于操作问题以及处理问题。

体系

Throwable类(子类:Error和Exception)是 Java 语言中所有错误或异常的超类。

异常的继承体系:

Throwable

Error

Exception

RuntimeException

方法:

String getMessage():获取异常信息,返回字符串。

String toString():获取异常类名和异常信息,返回字符串。

void printStackTrace():获取异常类名和异常信息,以及异常出现在程序中的位置,返回值void。

void printStackTrace(PrintStream s):将此 throwable 及其追踪输出到指定的 PrintWriter,通常用该方法将异常内容保存在日志文件中,以便查阅。

[b]Error[/b]

通常指 JVM 出现重大问题如:运行的类不存在或者内存溢出等。不需要编写针对代码对其处理,程序无法处理。

[b]Exception[/b]

异常处理两种方式:

捕获异常:try catch 直接处理可能出现的异常;

声明异常:throws 声明告诉调用者可能的异常,暴露问题,调用者自己处理。

异常的分类:

编译时被检查异常 —> 编译异常(只要是Exception和其子类都是,除了特殊子类RuntimeException体系)

解决方法:在程序中必须使用 try…catch 处理。

异常处理格式

try {

//可能出异常的代码

}

catch(异常类 对象) {

//处理该异常类型的语句

}

[finally] {

//一定会执行的代码(通常用来关闭资源。比如:数据库资源,IO资源等)

//catch 块中使用了”System.exit(0);” 语句除外

}

注:Java7:将多个异常写到了同一个 catch 代码块

catch (NumberFormatException| ArithmeticException e ) {e.printStackTrace();}


try语句使用注意:

try是一个独立的代码块,在其中定义的变量只在该变量块中有效,如果在try以外继续使用,需要在try外建立引用,在try中对其进行初始化。IO,Socket就会遇到。

函数未抛出异常,try中抛出异常,其后面的语句将执行不到。编译将报错;函数抛出异常后,try后面的语句未执行,不会报错,代码示例如下:

class ExceptionPractise {

public static void func()//throws Exception {
try {
throw new Exception();
//System.out.println("A");
}
catch (Exception e) {
System.out.println("B");
}
}

public static void main(String[] args) {
try {
func();
}
catch (Exception e) {
System.out.println("C");
}

System.out.println("D");
}
}
/*
说明:1.若有System.out.println("A");语句编译会失败,因为抛出异常后,该句执行不到
2.不存在System.out.println("A");语句,则打印B和D
3.若有System.out.println("A");语句,且加上throws Exception,则打印B和D
*/


编译时不被检测的异常 —> 运行异常(Exception中的RuntimeException和其子类)

这种问题一般不处理,直接编译通过,在运行时,让调用者调用时的程序强制停止,让调用者对代码进行调整。

RuntimeException是那些可能在Java虚拟机正常运行期间抛出的异常的超类,可能在执行方法期间抛出但未被捕获的RuntimeException的任何子类都无需在throws子句中进行声明

自定义异常:可以自定义出的问题称为自定义异常。

特点:

自定义类继承Exception或者RuntimeException,通过构造函数定义异常信息

通过throw将自定义异常抛出

示例:当要定义自定义异常的信息时,可以使用父类已经定义好的功能,将异常信息传递给父类的构造函数。

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


throws和throw的区别

throws

用在方法声明后面,跟的是异常类名

可以跟多个异常类名,用逗号隔开

表示抛出异常,由该方法的调用者来处理

throw

用在方法体内,跟的是异常对象名

只能抛出一个异常对象名

表示抛出异常,由方法体内的语句处理

异常处理原则:

异常处理的原则:

函数内容如果抛出需要检测的异常,那么函数上必须要声明。否则,必须在函数内用try/catch捕捉,否则编译失败。

如果调用到了声明异常的函数,要么try/catch,要么throws,否则编译失败。

什么时候catch,什么时候throws呢?功能内容可以解决,用catch。解决不了,用throws告诉调用者,由调用者解决。

一个功能如果抛出了多个异常,那么调用时,必须有对应多个catch进行针对性处理。内部有几个需要检测的异常,就抛几个异常,抛出几个,就catch几个。

异常在子类覆盖中的体现

子类在覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法,只能抛出父类的异常或者该异常的子类

如果父类方法抛出多个异常,那么子类在覆盖该方法时,只能抛出父类异常的子类

如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法时,也不可以抛出异常。

如果子类方法发生了异常,就必须要进行try处理,绝对不能抛。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: