黑马程序员_异常

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


一 异常

1 异常:程序运行时的不正常,java将这些异常封装成了对象
(1)作用:将问题进行封装,将正常流程代码和问题处理代码相分离
(2)异常分为两大体系,Error和Exception,其父类是Throwable。
    其中,Error是严重的异常,一般不编写针对的处理代码。Exception是非严重的异常,可编写针对性的代码进行处理。
(3)父类Throwable类中定义的是所有异常的共性方法。
     方法摘要:
     getMessage() 获取异常信息
     toString() 获取异常类名和异常信息
     printStackTrace()获取异常类名和异常信息,以及异常出现在程序中的位置

2 异常的处理
(1)java虚拟机本身有异常处理机制,如果程序发生异常,java虚拟机会抛出异常信息并使程序停止
(2)java提供的处理异常语句

try
{
	需要被检查的代码;		
}
catch(异常类 变量)
{
	处理异常的代码;
}
finally
{
	一定会执行的语句;//一般用于关闭资源
}
(3)还有两种格式
    try{} catch(){}
    try{} finally{} 


3 throws和throw
(1)throws关键字用于在方法上标明该方法可能会发生某类异常
(2)声明异常时,建议声明更为具体的异常,这样处理的更为具体
(3)如果调用者调用了在方法上标明throws的方法,调用者必须处理该异常或者在自己所在的函数上声明异常
(4)throw关键字用于在方法内手动抛出异常对象
(5)throw和throws的区别:
         throws定义在函数上,后面跟异常类,可以多个,用于声明该函数可能发生某类异常。
         throw定义在函数内,后面跟异常对象,用于抛出异常对象。

4 多异常处理
(1)如果方法上声明了多个异常,那么调用者应该定义多个对应的catch块
(2)如果多个catch块存在继承关系,那么父类的catch块放在最下面

下面通过一个例子说明:

class  Demo
{
	public static void main(String[] args) 
	{
		ExceptionDemo ed=new ExceptionDemo();
		try
		{
			//该方法上throws了异常,调用该方法需要处理或在主函数上声明,这里用的是try处理
			ed.show(1);
		}
		catch (ArrayIndexOutOfBoundsException e)
		{
			//如果真的发生ArrayIndexOutOfBoundsException异常,会执行该语句.不发生异常该语句不会执行
			System.out.println("角标越界啦");
		}
		catch (ArithmeticException e)
		{
			//如果真的发生ArithmeticException异常,会执行该语句.不发生异常该语句不会执行
			System.out.println("除以0啦");
		}
		catch (Exception e)
		{
			//因为Exception是他们的父类都能接受,所以应该放在最下面。
			//但是不建议用,因为这样的话很容易将问题隐藏掉
			System.out.println("除以0啦");
		}
		finally
		{
			System.out.println("over");//不管有没有异常发生都会执行
		}
			
	}
}

class ExceptionDemo
{
	//在方法上声明可能会发生数组角标越界异常和算数运算异常
	public void show(int x) throws ArrayIndexOutOfBoundsException,ArithmeticException
	{

		int[] arr=new int[4];
		System.out.println(arr[3]);
		int y=10/x;		
		System.out.println(y);
	}
}

5 自定义异常
(1)在我们做项目时,当我们所描述的问题java没有进行封装时,我们可以将自己的问题进行封装对象。
(2)自定义异常时,应该继承Exception或RuntimeException,让其类继承java异常体系,具备可抛性以及使用体系的共性方法。
(3)如果方法中出现通过throw抛出的异常时,一般情况下,应当在函数上声明异常(RuntimeException及其子类除外)
6 RuntimeException类
(1)RuntimeException是Exception的一个特殊子类,是运行时异常
(2)当函数抛出RuntimeException以及其子类时,函数上可以不用声明,调用者也可以不用处理
(3)该异常发生是因为乱传数据而导致的,所以必须让程序停下来由程序员修改代码

举例说明:

//定义一个长方形类
class ChangFangXing
{
	private double len;
	private double wid;
	//初始化长和宽
	ChangFangXing(double len,double wid)
	{
		//判断长和宽,如果小于0就抛出异常程序结束
		if(len<=0||wid<=0)
			throw new NoFuShuException("长或宽不大于0,不是个长方形,无法求面积");
		else
		{
			this.len=len;
			this.wid=wid;
		}
		
	}
	//返回面积
	public double area()
	{
		return len*wid;
	}
}
//自定义一个异常类继承RuntimeException成为运行时异常
//让程序一发生异常就程序停止
class NoFuShuException extends RuntimeException
{
	NoFuShuException(String msg)
	{
		super(msg);
	}
}

class RuntimeExceptionDemo 
{
	public static void main(String[] args) //主函数
	{
		//创建长方形对象,在这里不try处理
		//因为如果程序发生异常是因为调用者误传参数导致的,所以需要让程序停止,有程序员修改
		ChangFangXing cfx=new ChangFangXing(3.0,-4.0);
		//程序如果发生异常,下面语句不执行
		double a=cfx.area();
		System.out.println(a);
	}
}

7 对于异常,分两种
(1)编译时被检测的异常,
(2)编译时不被检查的异常,运行时异常,也就是RuntimeException及其子类
8 finally代码块
(1)finally代码块里面定义的是一定会执行的语句。包括前面读到return语句。
(2)finally有一种情况不会被执行到,就是读到System.exit(0);
(2)通常用于关闭资源
9 异常在子父类覆盖的体现
(1)子类覆盖父类方法时,父类方法抛出异常,那么子类只能抛出该异常或该异常的子类
(2)子类覆盖父类方法时,父类抛出多个异常,子类只能抛出多个异常的子集
(3)子类覆盖父类方法时,父类没有抛出异常,子类也不能抛出异常,如果子类方法发生异常,只能内部处理

总结就是:父类没有异常,之类不能有异常。父类就算有,子类不能比他多,子类有只能是父类异常本身或该异常的子类


二 包(package)
1 概述:对类进行分类管理,为类提供多层命名空间,包也是封装的一种形式。必须写在程序的第一行

2 作用:可以以将源文件与class文件分离,提供安全性。

3 package和import关键字
  package用来标识class文件所属的包,后面加包名,一般包名全部小写,必须放在程序的第一行。如:package pack;
  import用于导入某个包里的类文件,后面可以加包名.class文件名(代表导入具体的某个类),也可以加包名.*(代表导入某个包的全部类文件)

4 一个包中的类要被访问,要有足够大的权限,所以被访问的类要被public修饰,以及成员也要被public修饰。
(1)protected(保护权限):不同包中的子类可以直接访问父类中被protected修饰的成员。
(2)包与包之间可以使用的权限只有两种,public和protected


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值