Java异常类

编译时期异常方法说明
IOException当发生某种I/O异常时,抛出此异常
SQLException提供关于数据库访问错误或其他错误信息的异常
ClassNotFoundException类没有找到异常
NoSuchFieldException类不包含指定名称的字段时产生的信号
NoSuchMethodException无法找到某一特定方法时,抛出该异常

运行时期异常方法说明
IndexOutOfBoundsException指示某集合或数组的索引值超出范围时抛出该异常
NullPointerException当应用程序试图在需要对象的地方使用null时,抛出该异常
AritmeticException当出现异常的运算条件时,抛出此异常
IllegalArgumentException抛出的异常表明向方法传递了一个不合法或不正确的参数
ClassCastException当试图将对象强制转换为不是实例的子类时,抛出该异常

捕获异常:
1.try……catch……finally(标准格式)   捕获异常

2.throws 抛出异常

捕获异常的变形格式:

a、try……catch

b、try……catch……catch

c、try……finally……

一般格式:
try{

   //可能会出现问题的代码

}catch(异常类名 变量名){

  //输出语句处理

}

如果有多个异常存在如何处理:

a、针对多个异常分别try……catch……(较麻烦实际开发中不使用)

/**
 * 
 */
package org.zst.Exception;

/**
 * @author:zsyht
 * @date:2017-11-22上午11:32:37
 */
public class Test1 {
	public static void main(String[] args) {
		int a = 10;
		int b =0;
		int[] arr={1,2,3}; 
		try{
			System.out.println(a/b);
		}catch(ArithmeticException e){
			System.out.println("被除数不能为0!");
		}
		try{
			System.out.println(arr[3]);
		}catch(IndexOutOfBoundsException e){
			System.out.println("您访问的元素越界!");
		}
	}
}

b、try{

        //可能会出现问题的语句

}catch(异常类名1  变量名){
……

}catch(异常类名2  变量名){

……

}

多个异常一块处理,只要try语句中的代码和catch语句中的代码所描述的异常类信息一致,那么直接走catch语句里的代码,try……catch语句结束。

/**
 * 
 */
package org.zst.Exception;

/**
 * @author:zsyht
 * @date:2017-11-22上午11:32:37
 */
public class Test1 {
	public static void main(String[] args) {
		int a = 10;
		int b =0;
		int[] arr={1,2,3}; 
		try{
			System.out.println(a/b);
			System.out.println(arr[3]);
		}catch(ArithmeticException e){
			System.out.println("被除数不能为0!");	
		}catch(IndexOutOfBoundsException e){
			System.out.println("您访问的元素越界!");
		}
	}
}

JDK1.7给出异常处理的新方式:

try{

  //可能出现问题的代码

  //……

}catch(异常类名1 | 异常类名2   变量名){

//异常处理

}

注意事项:

a、多个异常类名之间必须时平级关系

b、这种格式在实际开发中虽然有多个异常,但针对具体异常给出具体异常

/**
 * 
 */
package org.zst.Exception;

/**
 * @author:zsyht
 * @date:2017-11-22上午11:32:37
 */
public class Test1 {
	public static void main(String[] args) {
		int a = 10;
		int b =0;
		int[] arr={1,2,3}; 
		try{
			System.out.println(a/b);
			System.out.println(arr[3]);
		}catch(ArithmeticException |IndexOutOfBoundsException e){
			System.out.println("被除数不能为0!");	
			System.out.println("您访问的元素越界!");
		}
	}
}

标准格式:

try{

 //需要执行的语句

}catch(异常类名  变量名){
 //异常处理

}fianlly{

//一定会被处理的语句

}

在异常处理时,应该尽量使用finally块进行资源回收,因为在try……catch……finally语句块中,不管程序是否发生异常,最终都会执行fianlly语句块,因此可以在finally块中添加释放资源的代码。

finally中的代码不执行只有一种情况,JVM退出,System.exit(0)。


抛出异常:

1.throws通常用于方法声明,当方法中可能存在异常,却不想在方法中对异常进行处理时,就可以在方法声明时使用throws声明抛出的异常,然后再调用该方法的其他方法中对异常进行处理。如需使用throws声明抛出多个异常,各个异常之间要用逗号隔开。

格式:

数据类型  方法名(形参列表)  throws  异常类1,异常类2,……,异常类n{

  方法体

}

2.throw语句通常是在方法中,在程序中自行抛出异常,使用throw语句抛出的是异常的实例,通常与if语句一起使用。

格式:

throw new Exception("对异常的说明")

面试题:throw和throws的区别?

throws可以抛出多个异常,中间用","隔开,在方法声明上抛出,表示异常的一种可能行,后面跟异常类名,表示抛出异常的一种可能性。

throw也表示抛出,后常跟匿名对象,只能跟具体的一个异常对象,在方法语句中抛出,表示异常的绝对性,有方法中的某些语句处理。

实际开发中throws比throw用的多,捕获异常比抛出异常用的多。


实际开发中有时需要自定义一个异常类,继承自Exception或RuntimeException

注意事项:

1.子类在重写父类中方法的时候,如果父类中方法抛出异常,那么子类重写这个方法抛出异常就不能比父类中该方法的异常大。

2.子类继承父类,重写父类中的方法的时候,如果本身父类中该方法没有异常,那么子类中重写该方法的时候不能抛出异常,只能捕获异常。

/**
 * 
 */
package org.zst.Exception;

/**
 * @author:zsyht
 * @date:2017-11-22下午12:59:17
 */
public class NewException extends Exception{
	public NewException(Double r){
		System.out.println("发生异常:圆的半径不能小于20");
		System.out.println("圆的半径:"+r);
	}

}
/**
 * 
 */
package org.zst.Exception;

/**
 * @author:zsyht
 * @date:2017-11-22下午1:24:26
 */
public class Example {
	public static void showArea(double r)throws NewException{
		if(r<=20){
			throw new NewException(r);
		}
		double area=3.14*r*r;
		System.out.println("圆的面积是:"+area);
	}
	public static void main(String[] args) {
		try{
			showArea(10);
		}catch(NewException e){
			System.out.println(e);
		}
	}
}



获取异常信息的方法:
try里面的代码一但出现问题,jvm就会针对这个问题抛出一个异常,然后和catch里所描述的异常进行是否匹配,如果一致就会产生一个异常对象,处理这个异常对象就会调用一些方法。

方法说明
String getLocalizedMessage()获得此Throwable的本地化描述
String getMessage()获得此Throwable的详细消息字符串
void printStackTrace()将此Throwable及其栈踪迹输出至标准错误流
String toString获得此Throwable的简短描述

/**
 * 
 */
package org.zst.Exception;

/**
 * @author:zsyht
 * @date:2017-11-22下午1:47:09
 */
public class Test2 {
	public void method(){
		try{
		int a = 10;
		int b = 0;
		int z = a/b;
		System.out.println(z);
	    }catch(ArithmeticException e){
	    	e.printStackTrace();
	    	System.out.println("调用getMessage: "+e.getMessage());
	    	System.out.println("调用getLocalizedMessage: "+e.getLocalizedMessage());
	        System.out.println("调用toString: "+e.toString());
	    }
  }
	public static void main(String[] args) {
	    Test2 a = new Test2();
	    a.method();
   }
}


异常类的使用原则:

a、不要过多的使用异常,这样会增加系统的负担

b、在方法中使用try……catch语句块捕获异常时,要对异常作处理

c、try……catch语句块的范围不要太大,这样不利于对异常做分析

d、一个方法被覆盖时,覆盖它的方法必须抛出相同的异常或子异常

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值