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

黑马程序员------Java基础学习------异常处理

2015-03-31 16:59 417 查看
-------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

异常处理

异常的定义:异常是导致一个程序中断的指令流,一旦出现之后程序就将立即退出,观察以下产生异常的程序。

java中所以异常类都会直接或间接地继承自Exception

常见异常类型:

1. Exception类:Java中凡是继承自Exception而不是继承于RuntimeException的类都是非运行异常,对于非运行出现异常(checked exception),必须要对其进行异常处理

2. RuntimeException类:RuntimeException直接继承于Exception类,它叫运行时异常,java中运行时异常都间接或直接的继承于它,对于运行时出现异常,我们可以不对其进行处理,也可以对其进行处理。推荐不对其进行处理。

3. NullPointerException是空指针异常,出现该异常的原因在于某个引用为null,但你却调用了它的某个方法,这是就会出现该异常。 

异常处理方式有两种:

第一种,是使用try…catch…finaly进行捕获;

第二种是在调用该会产生异常的方法所在的地方声明throws Excepyion;

异常的处理流程:

1. 每当一个异常产生之后,实际上都会自动生成一个异常类的实例化对象,如果此时编写了异常处理语句的话,则进行异常的处理,如果没有的话,则交给 JVM 进行处理。

2. 使用了 try 捕获异常之后,将自动与 catch 中的异常类型相匹配,如果匹配成功,则表示可以使用此 catch处理异常,如果都没有匹配成功的,则不能处理。

3. 程序中不管是否出现了异常,如果存在了 finally 语句,都要执行此语句的代码。

1. 捕获异常
try
{
可能出现异常的语句;
} catch(异常类型异常对象)
{
处理异常;
} catch(异常类型异常对象)
{
处理异常;
}
......                 //     不管try后面多少个catch,最终只会有一个catch被执行
finally
{
</pre><pre name="code" class="java">}


  异常处理的出口, 一定会被执行  。



注意:如果一个 try 语句之中同时有多个 catch 的话一定要记住的是,捕获范围小的异常要放在捕获范围大的异常之前,一般在开发中为了简单起见,大部分的异常都直接使用 Exception 接收即可。

例:
public class ExceptionDemo {
public static void main(String args[]) {
int x = 10;
int y = 0;
try {
System.out.println("计算结果:" + (x / y));
} catch (ArithmeticException e) {
System.out.println("出现了异常:" + e);
} finally {
System.out.println("不管是否有异常,都执行此语句!");
}
}
}


2. 抛出异常
class ExpDemo {
public void div() throws Exception {
return i / j ;
}
}
public class ExceptionDemo{
public static void main(String[] args) throws Exception {
System.out.println(new ExpDemo ().div(10,0));
}


throw和throws有什么区别?

1. throw 用于抛出异常对象,后面跟的是异常对象;throw用在函数内,人为的抛出一个异常对象
public class ExpDemo {
public static void main(String args[]) {
try{
throw new Exception("自己抛") ;
}catch(Exception e){
e.printStackTrace() ;
}
}
}


2. throws 用于抛出异常类型,后面跟的异常类名,可以跟多个,用逗号隔开;主要是用在函数的声明上,表示方法不处理异常,而是交给被调用处进行处理。

注:throws 关键字不光可以在普通的方法上使用,主方法上也可以使,如果在主方法上使用的话就表示一旦出现了异常之后,继续向上抛,表示由 JVM 进行处理了。
class ExpDemo {
public int div(int i,int j) throws Exception{
return i / j ;
}
}
public class ExceptionDemo{
public static void main(String[] args) throws Exception {
System.out.println(new ExpDemo ().div(10,0));
}


自定义异常类

所谓自定义异常类,通常就是定义一个继承自Eception类的子类,通常我们都会直接继承自Eception类,一般不会继承某个运行时的异常类。

1. 抛出异常
class MyException extends Exception {
public MyException() {
super();
}
public MyException(String message) {
super(message);
}
}
class Exception1 {
public void method(String str) throws MyException {
if (str == null) {
throw new MyException("传入的字符串不能为null");
} else {
System.out.println(str);
}
}
}
public class practice {
public static void main(String[] args) throws MyException{
Exception1 e1 = new Exception1();
e1.method(null);
}
}


捕获异常
class MyException extends Exception {
public MyException() {
super();
}
public MyException(String message) {
super(message);
}
}
class Exception1 {
public void method(String str) throws MyException {
if (str == null) {
throw new MyException("传入的字符串不能为null");
} else {
System.out.println(str);
}
}
}
public class practice {
public static void main(String[] args) {
Exception1 e1 = new Exception1();
try{
e1.method(null);
}
catch(MyException e){
e.printStackTrace();
}
finally{
System.out.println("处理完毕");
}
}
}


总结:
Exception 和 Error的子类名大都是以父类名作为后缀。

Java异常其实是对不正常情况的一种描述,并将其封装成对象。

Java在设计异常体系时,将容易出现的异常情况都封装成了对象。

在java处理多异常时捕获小范围的异常必须放在大范围异常之前。
finally代码块只在一种情况下不执行:System.exit(0)。



------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: