黑马程序员-----Java基础学习异常

/*
----------------------------------------------------------------------------------
01-面向对象(异常-概述)
----------------------------------------------------------------------------------
异常:是在运行时期发生的不正常情况(两个例子总结出来的结论)
Java 为什么会有这种异常机制呢? 比较例子:生活中也有不正常的情况(堵车呀、意外、大姨妈不调)
程序也要避免意外的发生。要预防。




异常通俗例子:睡觉,睡-5分钟或睡时间太久了(睡死)。。。不正常程序,需要判断,用if判断


对于问题的处理,用面向对象的方法对其封装处理,问题就是对象!
将问题处理的全部过程进行对象的封装,省去了一句一句的处理,提高阅读性。




在Java中用类的形式对不正常的情况进行了描述和封装对象。
描述不正常的情况的类,就称为异常类。


以前正常的流程代码和问题处理代码相结合,紧密且阅读性差。
现在将正常流程代码和问题处理代码分离。提高阅读性。


其实异常就是java通过面向对象的思想将问题封装成了对象。
用异常类对其进行描述。
不同的问题用不同的类进行具体的描述,比如角标越界、空指针等(运行后的异常具体描述)


----------------------------------------------------------------------------------
02-面向对象(异常-体系)
----------------------------------------------------------------------------------




问题很多,意味着描述的类也很多
将其共性进行向上抽取,形成了异常体系。


最终问题(不正常情况)就分成了两大类。(注意是类)


共性的父类:
		  Throwable: 
			|--1,一般不可处理的。Error                    疾病例子:能治愈和不能治愈
			特点:是由JVM抛出的严重性的问题。
			      这种问题发生一般不针对性处理,直接修改程序(因为处理不了)
				  内存溢出例子:int [] arr = new int[1024*1024*800]; //OutOfMemoryError
			|--2,可以处理的。Exception


Throwable体系的子类都可以抛,以上两种情况都是问题,问题发生就该可以抛出,让调用者知道并处理.
可抛性到底指的是什么呢?怎么体现可抛性呢?
其实是通过两个关键字来体现的。
throws throw, 凡是可以被这两个关键字所操作的类和对象都具备可抛性。


该体系的特点:
	子类的后缀名都是用其父类名作为后缀,阅读性很强。
----------------------------------------------------------------------------------
03-面向对象(异常-原理&异常对象的抛出throw)
----------------------------------------------------------------------------------


用了两个类来演示解读运行异常。


class Demo
{
	public void method(int[] arr,index)
	{
		System.out.println(arr[index]);   // 调用时,如角标越界,就在此处建立一个异常对象
		                                   // new ArrayIndexOutOfBoundsException(index)
										   // throw 封装异常对象抛到主函数调用者,主函数处理不了,丢给JVM
								           // Java JVM就是终点。
	}
}
 JVM自己默认能抛出异常,我们可以自己抛,为什么要自己抛?自己抛信息更加详细,同时能清晰自己的程序
 throw 用于抛异常对象
 if(index>=arr.length)
 {
		throw new ArrayIndexOutOfBoundsException("定义自己的提醒信息"+index);
 }


----------------------------------------------------------------------------------
04-面向对象(异常-自定义异常&异常类的抛出throws)
----------------------------------------------------------------------------------


负数不能说是角标越界,要想更加具体,Java中又没有,那么就自己定义一个异常类
按照java异常的创建思想,面向对象,将负数角标进行自定义,并且封装成对象。


重点:让一个类成为异常类,不用多说,必须继承异常体系,异常体系的子类,才具备可抛性
	  才能被两个关键字操作 throw throws。
      class FuShuIndexException extends Exception    完成这步就可以上演抛自己的异常玩玩
	                                                 但是编译就出错,没有对异常存在的类进行声明或捕捉。
													 Throwable 父类里面都定义了很多的字符串说明,想具体
													 打印出来文字说明,直接继承就好。
	   




----------------------------------------------------------------------------------
05-面向对象(异常-编译时检测异常和运行时异常的区别&throw和throws的区别)
----------------------------------------------------------------------------------
异常的分类:
1.编译时被检测异常:只要是Exception和其子类都是,除了特殊子类RuntimeException体系
					这种问题出现后,在编译时检测,希望有想对应的处理。


2.编译时不检测异常(运行时异常):就是Exception中的RuntimeException和其子类。
					这种问题出现后,功能不能继续运行,更多是因为调用者的原因导致的
					或者引发了内部状态的改变导致的(这种情况多线程能学到)
					这种问题一般不处理,编译直接通过,运行时,让调用者调用时直接强制停止。




(毕老师直接把原来的声明的函数继承到RuntimeException上,编译就通过了,说明RuntimeException编译器不管)


在类上声明异常的目的是让调用者处理。


(在api文档里面介绍两大异常类的时候没听懂,先记住结论)~_~..


所以自定义异常时,要么继承Exception,要么继承RunntimeException.
 
 throw 和throws的区别


 1,throws使用在函数上。
	throw使用在函数内。
 2,throws抛出的是异常类,可以抛出多个,用逗号来隔开 (一个函数内只能引发一个异常,因为一个出现就结束了,出栈了)
    throw抛出的是异常对象,一次只能抛一个。


声明通俗理解:出了问题,不关我事,给你处理。
捕捉通俗理解:出了问题,抓过来,一顿打(解决),对异常的具体操作。








----------------------------------------------------------------------------------
06-面向对象(异常-异常捕捉try catch)
----------------------------------------------------------------------------------


异常处理的捕捉形式:
这是可以对异常进行针对性处理的方式


格式:
try
{
	//需要被检测异常的代码(就是说出了异常,异常对象就被catch抓取)
}
catch(异常类 变量)//该变量用于接收发生的异常对象。       针对性的类,别来个笼统的Exception
{
	//处理异常的代码(接收过来处理)
}
finally
{
	//一定会被执行的代码。
	
}


安检例子:try是检测 ,catch检测到出问题就处理。没catch没处理,没catch就是浮云






毕老师例子:1,主函数调用int num = d.method(arr,-30);
            2, public int method (in[] arr,int index)throws FuShuIndexException  这个函数就进栈了
			3,if(index<0)判断满足就 throw new FuShuIndexException("角标变成负数啦!!")就抛过去给try,
			   try已接收到 throw new FuShuIndexException,就给catch,catch(FuShuIndexException e)就会有
				FuShuIndexException e = new FuShuIndexException("角标变成负数啦!!");接收建立对象,
				就开始执行catch,执行完catch后继续执行下面的语句。


			 System.out.println("e");直接输出对象,默认e.toString()
			 e.printStackTrace();//JVM默认的异常处理机制就是这个。


----------------------------------------------------------------------------------
07-面向对象(异常-多catch情况)
----------------------------------------------------------------------------------


抛几个,catch几个。
先丢给第一个catch,看是否所属。
catch中存在父类异常时,需要放在最后面。




----------------------------------------------------------------------------------
08-面向对象(异常-异常处理原则)
----------------------------------------------------------------------------------


异常处理原则:
1,函数内容如果抛出需要检测的异常,那么函数上必须要声明。
   否则必须在函数内用trycatch捕捉,否则编译失败。


2,如果调用到了声明异常的函数,要么trycatch要么throws,否则编译失败。


3,什么时候catch,什么时候throws 呢?
	功能内容可以解决,就用catch。
	解决不了,就用throw告诉调用者,让调用者来处理。


4,一个功能如果抛出了多个异常,那么调用时,必须有对应多个catch进行针对性的处理
	内部有几个需要检测的异常,就抛几个异常,抛出多少个,就catch多少个。


----------------------------------------------------------------------------------
09-面向对象(异常-finally代码块)
----------------------------------------------------------------------------------


引出问题点:finally中带的输入语句,与主函数中的输出语句有什么区别?
			catch中带上return便知区别,因为return结束了主函数,而finally
			中的语句一定执行。finally有没有可能不执行到?答案是有!
			System.exit(0);退出JVM!就不会执行到。


用数据库例子来说明finally重要性:其实是一个擦屁股的作用,通常用于关闭(释放)资源。


try catch finally  代码组合特点:


1,try catch finally


2,try catch(多个)当不需要释放资源时,可以不用定义finally。


3,try finally  异常无法直接catch处理,但是资源需要关闭。




----------------------------------------------------------------------------------
10-面向对象(异常-异常应用)
----------------------------------------------------------------------------------
老师用电脑上课例子!
异常转换,将对方熟悉的异常抛出去
数据库例子:异常的封装,将异常放在内部处理,处理不了再抛


需自行敲写代码练习。




----------------------------------------------------------------------------------
11-面向对象(异常-异常注意事项)
----------------------------------------------------------------------------------


Exception
    |--A
	    |--B
	|--C


class Fu
{
	void show()throw A
	{


	}
}
class Zi extends Fu
{
	void show()throw B   //要想覆盖父类,就要抛出父类及子类的异常。
}


异常的注意事项:
1,子类在覆盖父类方法时,父类的方法如果抛出了异常,
那么子类的方法只能抛出父类的异常或者该异常的子类。


2,如果父类抛出多个异常,那么子类,只能抛出父类异常的子集(不可以抛比父类多)


简单说:子类覆盖父类只能抛出父类的异常或者子类或者子集。


注意:如果父类的方法没有抛出异常,那么子类覆盖时绝对不能抛。


*/


class  ExceptionDemo
{
	public static void main(String[] args) 
	{
		int [] arr = new int[3];
		arr = null;  //NullPointerException
		System.out.println(arr[3]);   //ArrayIndexOutofBoundsException  
	}
	public static void sleep(int time)
	{


	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值