首页 > 代码库 > java 异常的捕获及处理

java 异常的捕获及处理

在没有异常处理的程序中如果要回避异常,需要使用大量的判断语句,配合所想到的错误状况来捕捉程序中可能发生的错误。但是这样势必会导致程序运行效率降低。
java异常处理机制具有易于使用,可自定义异常类,处理抛出的异常的同时,又不会降低程序运行效率等优点。因而在java程序设计时,应充分的利用异常处理机会,以增进程序的稳定性及效率。
1.异常处理示例及基本格式:

package javaBasics;

public class test5 {

    public static void main(String[] args) {
        int i = 10;
        int j = 0;
        try{
        int temp = i/j;                        //此处会产生异常
        System.out.println("计算结果:"+temp);
        }catch(Exception e){
            System.out.println("出现异常:"+e);    //打印异常信息
            e.printStackTrace();            //打印完整的异常信息
        }finally{
            System.out.println("不管是否出现异常都执行此代码");
        }
        System.out.println("计算结束");
    }

}


程序的运行结果wei:

出现异常:java.lang.ArithmeticException: / by zero
不管是否出现异常都执行此代码
计算结束

2.Exception和error

共同点:
Exception和error是java异常结构中最常用的两个类,统称为异常。它们都是throwable的子类
不同点:
Exception表示程序中遇到的异常,可以用try catch进行捕获
error一般指jvm错误,程序中无法捕获

(拓展:Throwable是Exception的父类,可不可以直接使用Throwable呢?

首先,使用Throwable捕获异常,在代码中是没有任何问题的,但在开发中一般不会使用Throwable处理,因为其有Exception和error两个子类,Error本身不需要程序处理,而程序中需要处理的是Exception 所以没有必要使用Throeable)

3.Throw和Throws关键字

  Throws:在定义一个方法时,使用Throws关键字声明,表示此方法不处理异常,而是交给调用方法来处理

(注意:不要在main方法中使用throws,main方法为一切方法的起点,一切的操作也是由主方法开始的,所以,如果在主方法中使用throws,则程序出现问题后肯定交由jvm处理,将会导致程序中断。)

Throw:Throw关键字是人为的抛出异常,直接抛出异常的实例化对象。

package javaBasics;

public class test5 {

	public static void main(String[] args) {
		try{
			throw new Exception("自己抛出异常");		//抛出异常的实例化对象
		}catch(Exception e){
			e.printStackTrace();					//捕获异常
		}
	}

}

  Throw和Throws结合应用范例:

以下代码也是开发中使用较多的处理方式

package javaBasics;

public class Math {
	public int div(int i,int j) throws Exception{
		int temp = 0;
		try{
		temp = i/j;
		}catch(Exception e){	//捕获异常
			throw e;			//把异常交给被调用处处理
		}finally{
			System.out.println("计算结束");
		}
		return temp;
	}
}


package javaBasics;

public class test5 {

	public static void main(String[] args) {
		Math math = new Math();
		try {
			System.out.println(math.div(10, 0));
		} catch (Exception e) {					//进行异常捕获
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

  程序执行结果:

计算结束
java.lang.ArithmeticException: / by zero
at javaBasics.Math.div(Math.java:7)
at javaBasics.test5.main(test5.java:8)

4.自定义异常类:

package javaBasics;

public class MyException extends Exception{		//自定义异常类继承Exception类
	public MyException(String msg){				//构造方法接受异常信息
		super(msg);								//调用父类中的构造方法
	}

}


package javaBasics;

public class test5 {

	public static void main(String[] args) {
		try{
			throw new MyException("自定义异常信息");//抛出异常
		}catch(Exception e){					//异常捕获处理
			e.printStackTrace();
		}
	}

}

  

执行结果:

javaBasics.MyException: 自定义异常信息
at javaBasics.test5.main(test5.java:7)

 

5.Exception和runtimeException

如下示例:

package javaBasics;

public class test5 {

	public static void main(String[] args) {
		String str="123a";
		int temp = Integer.parseInt(str);	//将字符串转换成int类型
		System.out.println(temp*temp);
	}

}

执行结果:
Exception in thread "main" java.lang.NumberFormatException: For input string: "123a"
	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
	at java.lang.Integer.parseInt(Integer.java:492)
	at java.lang.Integer.parseInt(Integer.java:527)
	at javaBasics.test5.main(test5.java:7)

  执行报NumberFormatException  显然,程序已经中断,查看Integer类的parseInt方法源码可以看出throws抛出了NumberFormatException 给方法调用处处理。

public static int parseInt(String s) throws NumberFormatException {
return parseInt(s,10);
}

NumberFormatException 是runtimeException类的子类

可以得出:

Exception在程序中必须使用try。。。catch处理。

RuntimeException可以不用try。。。catch处理,产生异常后直接交给JVM处理。(在开发中最好使用try。。。catch进行处理)

java 异常的捕获及处理