java基础之异常类

java基础之异常类

1、异常类定义

异常:在java语言中,将程序执行中发生的不正常的情况称为异常。(开发过程中的语法错误和逻辑错误不是异常)。

Java程序在执行过程中所发生的异常事件可分为两类:

1Error:java虚拟机无法解决的问题。如:JVM系统内部错误、资源耗尽等严重情况。一般不编写针对性的代码进行处理。

//error实例
public class TestError {
	public static void main(String[] args) {
		main(args);
	}
}
执行后出现: Exceptionin thread "main" java.lang.StackOverflowError

2Exception:其他因编程错误或者偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。例如:空指针异常、视图访问不存在的文件、网络连接中断。

运行时异常:

/**
 * java.lang.Throwable
 * 	|--Error:错误,程序中不进行处理
 * 	|--Exception: 异常,要求在编写程序时,就要考虑到对这些异常的处理。
 *		|---编译时异常:在编译期间出现的异常
 *		|---运行时异常:在运行期间出现的异常
 */
public class TestError {
	//编译时异常
	@Test
	public void test5(){
		FileInputStream fis = new FileInputStream(new File("hello.txt"));
		int b;
		while((b = fis.read()) != -1){
			System.out.println((char)b);
		}
		fis.close();
	}
    //常见的运行时异常
	//1、数组下标越界异常:ArrayIndexOutOfBoundsException
	@Test
	public void test(){
		int [] temps = new int[10];
		System.out.println(temps[10]);
	}
	//2、算数异常:ArithmeticException
	@Test
	public void test2(){
		System.out.println(8/0);
	}
	//3、类型转换异常:ClassCastException
	@Test
	public void test3(){
		Object object = new Date();
		String str = (String) object;
	}
	//4、空指针异常:NullPointerException
	@Test
	public void test4(){
		Person p = new Person();
		p = null;
		System.out.println(p.toString());
		
		String str = new String("AA");
		System.out.println(str.length());
	}
}
class Person{	
}
2、异常类的处理方式
/**
 * 处理异常(指的是Exception):采用抓抛模型
 * 1、“抛”:当我们执行代码时,一旦出现异常就会在异常的代码处生成一个对应的异常类型对象,并将此对象抛出。(自动抛出   、 手动抛出throws)
 *  》一旦抛出此异常类的对象,那么程序就终止执行。
 *  》此异常类的对象抛给方法的调用者。
   在方法的声明处,显式的抛出该异常对象的类型
 * 例如:public static  void method2() throws FileNotFoundException,IOException{}
 * 当在此方法内部出现异常时,会抛出一个异常类的对象,抛给方法的调用者。
 * 异常的对象可以逐层向上抛,直至main方法中,可以再通过try。。catch方法进处理。
 */
 * 2、“抓”:抓住上一步抛出来的异常类的对象。
 * 	java提供了两种方式来处理异常类的对象:
 * 	处理方式一:
 * try{
 *   可能出现异常的代码
 * }catch(Exception e1){
 * 	 处理的方式1
 * }catch(Exception e2){
 *  处理的方式2
 * }finally{
 *  一定要执行的代码(但是此模块可选)
 * }
 * 注:1)、try内声明的变量,类似于局部变量,出了try语句,就不能被调用。
 * 	  2)、finally模块式可选的。
 *    3)、catch语句内部是对异常对象的处理。
 *    	getmessage()、printStackTrace()。
 *    4)、可以有多个catch语句,try中出现的异常类对象从上往下匹配catch中的异常类类型,一旦满足就执行catch中的代码,
 *    执行完就退出其后的多条catch语句。
 *    5)、如果异常处理了,那么其后的代码继续执行。(类似于放羊(程序执行)时,狼(异常)来了,我们打死了狼,还可以继续放羊。)
 *    6)、若catch中多个异常是并列关系,谁上谁下没有关系;但是如果多个catch中的多个异常关系是“包含关系”,
 *    须将子类放在父类的上边,否则会报错。
 *    7)、finally中存放的是一定会被执行的代码,不管catch中是否仍有异常未被处理以及是否有return语句。
 *    8)、try 、 catch内部可以继续嵌套try 、 catch语句。
 *3、对于运行时异常,可以不用处理,但是编译时异常必须进行显式处理。
* java的异常处理:抓抛模型
 * 1、抓:异常的处理,有两种方式(① try。。catch模型  ② throws+异常的类型)
 * 2、抛:一旦执行过程中出现异常,会抛出一个异常类对象。(自动抛出、手动抛出(throw + 异常类对象))
       》手动抛出的异常既可以是现成的异常类对象,也可以自己创建的异常类对象。
3、自定义异常类
//如何自定义一个异常类
//1、让自定义的异常类继承现有的异常类。
//2、提供一个序列号,提供几个重载的构造器即可。
//3、子类重写的父类的方法,其抛出的异常类型智能是被重写的方法的异常类的子类或者与一样。
//比如B类是A类的子类,重写的方法是method。当实现多态时,A a = new B(); a.method();此时如果子类B中的异常范围比A类的大,
//那么使用try catch或者throws进行处理时,是不能处理这种异常的。
public class MyException extends RuntimeException{
	private static final long serialVersionUID = 1L;
	public MyException(){
		super();
	}
	public MyException(String msg){
		super(msg);
	}	
}

4、练习题


public class EcmDef {

	public static void main(String[] args) {
		try{
		int i = Integer.parseInt(args[0]);//被除数
		int j = Integer.parseInt(args[1]);//除数
		ecm(i, j);
		}catch(NumberFormatException e){
			System.out.println("输入的数据类型不一致");
		}catch(ArrayIndexOutOfBoundsException e){
			System.out.println("缺少命名行参数");
		}catch(ArithmeticException e){
			System.out.println("分母是0");
		}catch(EcDef e){
			System.out.println(e.getMessage());
		}	
	}
	public static void ecm(int i , int j) throws EcDef{
		if(i<0 || j<0){
			throw new EcDef("您输入的数值存在负数");
		}
		System.out.println(i/j);
	}
}
class EcDef extends Exception{
	private static final long serialVersionUID = 1L;
	public EcDef(){
		super();
	}
	public EcDef(String msg){
		super(msg);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值