黑马程序员——异常学习笔记

时间:2022-12-08 21:20:38

------- android培训java培训、期待与您交流! ----------

异常的处理:

Java提供了特有的语句进行处理

try{
	//需要被检测的代码;
}catch(异常类 变量){
	//处理异常的代码;(处理方式)
}finally{
	//一定会执行的语句;
}


 

对捕获的异常进行常见的方法操作:

class ExceptionDemo{
	public static void main(String[] args){
		Demo d = new Demo();
		try{
			int x = d.div(4,0);
			System.out.println(“x=”+x);
		}
		catch(Exception e){//Exception e = new ArithmeticException();
			System.out.println(e.getMessage());// 异常信息
			System.out.println(e.toString());//异常名称 : 异常信息
			e.printStackTrace();//打印堆栈中的跟踪信息。(异常名称,异常信息,异常出现的位置),其实jvm默认的异常处理机制,就是在调用printStackTrace()方法。
		}
	}
}

throws:

class Demo
{
	int div(int a,int b) throws Exception//在功能上通过throws的关键字声明了该功能有可能会出现问题。
	{
		return a/b;
	}
}

对多异常的处理:

声明异常时,建议声明更为具体的异常。这样处理的可以更具体:

class Demo{
	int div(int a,int b) throws Arithmetic Exception,ArrayIndexOutOfBoundsException{
		int[] arr = new int[a];

		System.out.println(arr[4]);
		return a/b;
	}
}

class ExceptionDemo1{
	public static void main(String[] args){
		Demo d = new Demo();
		try{
			int x = d.div(4,0);
			System.out.println(“x=”+x);
		}catch (ArithmeticException e){
			System.out.println(e.toString());
		}catch (ArrayIndexOutOfBoundsException e){//根据捕捉到的不同异常,进入相对应的catch块内执行处理操作。声明了几个异常,就对应几个catch块,
			System.out.println(e.toString());
		}catch(Exception e){
			//如果多个catch块中的异常出现继承关系,父类异常catch块放在最下面。不要定义多余的catch块。
		}
	}
}

建议在进行catch处理时,catch中一定要定义具体处理方式,不要简单定义一句e.printStackTrack();,也不要简单的就书写一条输出语句。

 

自定义异常:

因为项目中会出现特有的问题,而这些问题并未被java锁描述并封装对象。所以对于这些特有的问题可以按照java的对问题封装的思想,将特有的问题进行自定义的异常封装。

(注:自定义异常只能手动抛出)

 

例:

需求:在本程序中,对于除数是负数,也视为是错误的是无法进行运算的,那么就需要对这个问题进行自定义的描述。

class FuShuException extends Exception{//定义一个异常类
	super(“出现了除数是负数的情况”);//定义自定义异常信息
				      //因为父类中已经把异常信息的操作都完成了,所以子类只要在构造时,将异常信息传递给父类,
				      //通过super语句,那么就可以直接通过getMessage方法获取自定义信息了。
}

class Demo{
	int div(int a,int b){
		if(b<0){
			throw new FuShuException();//手动通过throw关键字抛出一个自定义异常对象。
		}
	}
}

继承Exception原因:

异常体系有一个特点:因为异常类和异常对象都需要被抛出,他们都具备可抛性。这个可抛性是Throwable这个体系中的独有特点。只有这个体系中的类和对象才可以被throwsthrow操作。

 

throwsthrow的区别:

1、  throws使用在函数上;throw使用在函数内。

2、  throws后面跟的是异常类,可以跟多个。用逗号隔开;throw后跟的是异常对象。

 

RuntimeException:

Exception中有一个特殊的子类异常RuntimeException

如果在函数内部抛出该异常,在函数上不用声明。

如果在函数上声明了该异常,调用者可以不用进行处理。

之所以不用再函数上声明,是因为不需要让调用者处理。当该异常发生,希望程序停止。因为在运行时,出现了无法继续运算的情况,希望停止程序后,对代码进行修正。

 

自定义异常时:如果该异常的发生,无法再继续进行运算,就让自定义异常继承RuntimeException

 

对于异常分两种:

1,  编译时被检测的异常。

2,  编译时不被检测的异常(运行时异常。RuntimeException及其子类。)

 

finally:

finally中存放的是一定会被执行的代码。

finally中只有一种情况不会被执行,就是catch块中存在System.exit(0);语句,结束了jvm

 

异常在子父类覆盖中的体现:

1,  子类在覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法,只能跑哦出父类的异常或者该异常的子类。

2,  如果父类方法抛出多个异常,那么子类在覆盖该方法时,只能抛出父类异常的子集。

3,  如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法时,也不可以抛出异常。如果子类方法发生了异常,就必须要进行try处理,绝对不能抛。