异常(一)

异常Throwable

java程序也会存在某些不正常的情况,这些不正常的情况我们就统称为异常
java是面向对象的语言,任何的事物都可以使用类进行描述,那么这时候sun公司就使用了很多类描述了java程序中的各种不正常的情况,而用于描述程序不正常的情况的类我们称作为异常类,很多异常类堆积起来,就形成了java中的异常体系
大的方面来看,异常可以分为两种

-----throwable
----------Error(错误):一般是由于jvm或者硬件引发的问题,所以我们一般不会通过代码去处理错误
----------Exception(异常):是需要通过代码去处理的
-----------------1.运行时异常
-----------------2.编译时异常

throwable的常用方法
----toString(): 返回throwable的简短描述 返回当前异常的完整类名+病态信息
----getMessage(): 返回的是创建throwable传入的字符串信息
----printStackTrace():打印异常的栈信息

public class Demo3 {
	public static void main(String[] args) {
		/*
		Throwable t = new Throwable();
		String info = t.toString();
		String message = t.getMessage();
		System.out.println("toString:"+info); //java.lang.Throwable		包名(java.lang)+类名(Throwable)
		System.out.println("message:"+message);
		*/
		test();
	}
	public static void test(){
		Throwable t = new Throwable();
		t.printStackTrace();
	}
}

如何区分错误与异常呢

如果程序出现了不正常的信息,如果不正常的信息的类名是以Error结尾的,那么肯定是一个错误
如果是以Exception结尾的,那么就肯定是一个异常

疑问:异常对象从何而来

public class Demo3 {
	public static void main(String[] args) {
		
		test(4,0);//分母不能=0
	}
	public static void test(int a,int b){
		int c = a/b;
		System.out.println("c="+c);
	}
}

jvm的处理方式
jvm运行到a/b这个语句时,发现b为0,除数为0在我们现实生活中 是属于不正常的情况,jvm一旦发现这种不正常的情况的时候,那么jvm就会马上创建一个对应的异常对象,并且调用这个异常对象的printStackTrace方法来处理

异常的处理

方式一、捕获处理

格式

		try{
			可能发生异常的代码
		}catch (捕获的异常类型  变量名){
			异常的处理方式.....
		}

捕获处理要注意的细节是:
1.如果try块中代码出了异常,经过处理之后,那么try-catch块外的代码可以正常执行了
2.如果try块中出了异常的代码,那么在try块中出现异常代码后面的代码是不会执行的
3.一个try块后面是可以跟有很多个catch块的,也就是一个try块可以捕获多种异常的类型
4.一个try块可以捕获多种异常的类型,但是捕获的异常类型必须从小到大进行捕获,否则编译报错

public class Demo3 {
	public static void main(String[] args) {
		int [] arr = null;
		test(4,0,arr);
	}
	public static void test(int a,int b,int [] arr){
		int c=0;
		try{
			c = a/b;		
			//当try块中的一条语句出现异常,后面的语句直接跳过,调到处理该异常的catch语句
			System.out.println(arr.length);
		}catch(ArithmeticException d){
			//处理异常的代码
			System.out.println("异常处理了");
			System.out.println("toString:"+d.toString());
		}catch(NullPointerException d){
			//NullPointerException空指针异常
			System.out.println("出现了空指针异常");
		}
		//捕获的异常类型必须从小到大,不然编译器会报错,认为下面都是无用代码
		catch(Exception d){	//多态 Exception d = new NullPointerException(); 
			System.out.println("我是急诊室,包治百病!");
		}
		
		System.out.println("c="+c);
	}
}

疑问一、异常处理感觉没有作用,只是输出一句话而已?
异常处理非常有用,只不过我们目前所接触的知识点太过于局限了而已

疑问二、以后捕获处理的时候是否就是捕获Exception即可?
错的,因为我们在现实开发中遇到不同的异常类型的时候,往往会有不同的处理方式,所以要分开不同的异常类型处理

方式二、抛出处理

抛出处理(throw throws)

抛出处理要注意的细节:
1.如果一个方法内部抛出了一个编译时异常对象,那么必须要在方法上声明抛出
2.如果调用了一个声明抛出编译时异常的方法,那么调用者必须要处理异常
3.如果一个方法内部抛出了一个异常对象,那么throw语句后面的代码都不会在执行了(一个方法遇到了throw关键字,该方法也会马上停止执行的)
4.在一种情况下,只能抛出一种异常的对象

public class Demo4 {
	//也可以继续向上抛出,主方法抛给jvm
	public static void main(String[] args) throws Exception{
		//try{
			int [] arr=null;
			div(4,0,arr);//调用了一个声明抛出异常的方法
		//}catch(Exception a){
		//	System.out.println("出现异常了");
		//	a.printStackTrace();
		//}
	}
	//如果一个方法内部抛出了一个异常对象,那么必须要在方法上声明抛出
	public static void div(int a,int b,int [] arr)throws Exception{
		if(b==0){
			throw new Exception();
		}else if(arr==null){
			throw new NullPointerException();
		}
		int c = a/b;
		System.out.println("c="+c);
	}
}

throw与throws两个关键字:

1.throw关键字是用于方法内部的,throws适用于方法声明的
2.throw关键字是用于方法内部抛出一个异常对象的,throws关键字适用于在方法声明上声明抛出异常类型的
3.throw关键字后面只能有一个异常对象,throws后面依次可以声明抛出多种类型的异常

疑问:何时使用抛出处理?何时捕获处理?原则是如何?
如果你需要通知调用者,你的代码出现了问题,那么这时候就使用抛出处理
如果代码是直接与用户打交道,遇到了异常千万不要再抛,再抛的话,就给了用户了,这时候就应该使用捕获处理

编译时异常的概念在之后的自定义异常类中有讲到

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值