/*
----------------------------------------------------------------------------------
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)
{
}
}
黑马程序员-----Java基础学习异常
最新推荐文章于 2024-03-14 20:49:58 发布