首页 > 代码库 > 黑马程序员——面向对象--异常

黑马程序员——面向对象--异常

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

异常:就是程序在运行时出现不正常的情况
异常由来:问题也是现实生活中一个具体的事物,也可以通过java的类的形式进行描述,并封装成对象。
其实就是java对不正常情况进行描述的对象体现
对于问题的划分分为两种:
1.一种是严重的问题
2.一种是非严重问题
对于严重的,java通过error类进行描述
对于error一般不变写针对性的代码进行处理
对于非严重的,java通过Exception进行描述
对于Exception可以使用针对性的处理方式进行处理
无论Error还是Exception都具有一些共性内容
比如:不正常情况信息,引发原因等
Throwable
|--Error
|--Exeption
java提供了特有的语句进行处理
try{
需要被检测到代码
}
catch(异常类 变量)
{
处理异常的代码;(处理方式)
}
finally
{
一定会执行的代码;
}
3.对于补获到的对象进行常见方法操作
String getMessage();获取异常信息

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

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

		}
		System.out.println("over");
	}
}
对捕获的异常进行常见方法操作
String getMessage():获取异常信息
在函数声明异常,便与提高安全性,让调用处进行处理,不处理编译失败
对于多异常处理:
1.声明异常时,建议声明更为具体的异常,这样处理可以更为具体
2.对方声明几个异常,就对应几个catch块,不要定义多余的catch块
如果多个catch块中的异常出现继承关系,父类异常放在最下边
建立在进行catch处理时,catch中一定要定义具体处理方式
不要简单定义一句e.printStackTrace();
也不要简单定义一句输出语句

class Demo
{	
	int div(int a, int b)throws ArithmeticException,ArryIndexOutOfBoundsException
	//在功能上通过throws的关键字声明了该功能有可能会出现问题
	{
		int [] arr = new int[a];
		System.out.println(arr[4]);
		return a/b;
	}
}
class ExceptionDemo
{	
	public static void main(String args[]){
		Demo d = new Demo();
		try{
			int x = d.div(5,0);
			System.out.println("x="+x);
		}
		catch(Exception e)
		{
			System.out.println(e.toString);
		}
		catch(ArithmeticException e)
		{
			System.out.println(e.toString);
			System.out.println("by zero");
		}
		catch(ArrIndexOutOfboundsException)
		{
			System.out.println("e.toString);
			System.out.println("角标越界");
		}
		System.out.println("over");
	}
}
因为项目中会出现特有的问题
而这些问题并未被java所描述兵封装对象,所以对于这些特有的问题可以描述java的问题封装的思想
将特有的问题,进行自定义的异常封装
自定义异常
需求:
在本程序中,对于除数是-1,也是为是错误是无法进行运算的
那么就需要对这个问题进行自定义的描述
挡在函数内部出现了throw抛出异常对象,那么就必须要对应的处理动作
要么在内部try catch处理
要么在函数上让调用者处理
一般情况在,函数内出现异常,函数上需要声明。
发现打印的结果中只有一场的名称,却没有异常的信息
因为自定义的异常并未定义信息
如何定义异常信息呢?
因为父类中已经把异常信息的操作都完成了
所以子类只要在构造时,将异常信息传递给父类通过super语句
那么就可以直接通过getMessage方法进行自定义的异常信息
自定义异常:
必须是自定义类继承Exception
继承Exception原因:
异常类中有一个特点:因为异常类和一场对象都被抛出
他们都具备可抛性,这个可抛性是Throwable这个体系中独有的特点
只有这个体系中才可以被throws和throw操作
throws和throw的区别:
throws使用在函数上
throw使用在函数内
throws后面跟着的异常类,可以跟多个,用逗号隔开
throw后跟的是异常对象
<span style="font-family:KaiTi_GB2312;font-size:14px;">class fushuException exten</span>ds Exception
{
	private int value;
	fushuException()
	{
		super;
	}
	fushuException(String msg, int value)
	{
		super(msg);
		this.value = http://www.mamicode.com/value;>Exception中有一个特殊的子类异常RuntimeException运行异常
如果在函数内容抛出该异常,函数上可以不用声明,编译一样通过
如果在函数上声明了该异常,调用者可以不进行处理,编译一样通过
之所以不用在函数声明,是因为不需要让调用者处理
当该异常发生,希望程序停止,因为在运行时,出现了无法继续运行的情况,希望停下来以后对代码进行修正
自定义异常时,如果该异常的发生,无法再继续进行运算,就让自定义异常继续继承RuntimeException
对于异常分两种:
1.编译时被检测的异常
2.编译时不被检测的异常(运行时异常,runtimeException以及子类)

class fushuException extends RuntimeException
{
	fushuException(String msg)
	{
		super(msg);
	}
}
class Demo
{
	int div(int a, int b) throws Exception, throws ArithmeticException
	{
		if(b<0)
			throw new Exception("出现负数了");
		if(b==0)
			throw new ArithmeException("被零除了");
		return a/b;
	}
}

class ExceptionDemo
{	
	public static void main(String args[]){
		Demo d = new Demo();
		int x = d.div(4, -9);
		System.out.println("x="+x);
		System.out.println("over");
	}
}

/*
class Person
{
	public void checkName(String name)
	{
		
		//if(name.equals("lisi"))//NullPointerException
		if("lisi".equals(name))//if(name!=null && name.equals("lisi"))
			System.out.println("YES");
		else
			System.out.println("no");
	}
}

main()
{
	Person p = new Person();
	p.checkName(null);
}
*/


finally代码块:
/*
	finally代码块:定义一定执行的代码。
	通常用于关闭资源。
*/
class FuShuException extends Exception
{
	FuShuException(String msg)
	{
		super(msg);
	}
}

class Demo
{
	int div(int a,int b)throws FuShuException
	{
		if(b<0)
			throw new FuShuException("除数为负数");
		return a/b;
	}
}

class  ExceptionDemo5
{
	public static void main(String[] args) 
	{
		Demo d = new Demo();

		try
		{
			int x = d.div(4,-1);
			System.out.println("x="+x);

		}
		catch (FuShuException e)
		{
			System.out.println(e.toString());
			return;
			//System.exit(0);//系统,退出。jvm结束。
		}
		finally
		{
			System.out.println("finally");//finally中存放的是一定会被执行的代码。
		}


		System.out.println("over");
	}
}


class NoException extends Exception
{
}

public void method()throws NoException
{

	连接数据库;

	数据操作;//throw new SQLException();

	关闭数据库;//该动作,无论数据操作是否成功,一定要关闭资源。


	try
	{
		
		连接数据库;

		数据操作;//throw new SQLException();
	}
	catch (SQLException e)
	{
		会对数据库进行异常处理;
		throw new NoException();

	}
	finally
	{
		关闭数据库;
	}


}
catch是用于处理异常。如果没有catch就代表异常没有被处理过,如果该异常是检测时异常。那么必须声明。
class Demo
{
	public void method()
	{
		try
		{
			throw new Exception();//没有catch,必须声明异常
		}
		finally
		{
			//close
		}
	}
}
class
{
	public static void main(String args[]){
		System.out.println("hello world");
	}
}
异常在子父类覆盖中的体现;
1,子类在覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法,只能抛出父类的异常或者该异常的子类。
2,如果父类方法抛出多个异常,那么子类在覆盖该方法时,只能抛出父类异常的子集。
3,如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法时,也不可以抛出异常。
如果子类方法发生了异常。就必须要进行try处理。绝对不能抛。

class Aexception extends Exception
{
}
class BException extends AException
{
}
class CException extends Exception
{
}
class fu
{
	void show() throws AException
	{
	}
}
class test
{
	void function(fu f)
	{		
		try
		{
			f.show();
		}
		catch(AException e)
		{
		}
	}
}

class zi extends fu
{
	void show thros CException
	{
	}
}
class 
{
	public static void main(String args[]){
		test t = new test();
		t.function(new zi());
	}
}




黑马程序员——面向对象--异常