¥异常
异常就是在程序运行时出现不正常情况。
1 异常的由来:问题也是现实生活中一个具体的事物。也可以通过java的类的形式进行描述,并封装成对象。
其实就是java对不正常情况进行描述后的对象体现。
异常将正常的代码和问题处理代码分离。方便于阅读。
对于问题的划分,两种:一种是严重的问题,一种非严重的问题。
对于严重的,java通过Error类进行描述。
对于error一般不编写针对性的代码对其进行处理。
对于非严重的,java通过Exception类进行描述。
对于Exception可以使用针对性的处理方式进行处理。
无论error 或者exception都具有一些共性内容。
比如:不正常情况的信息,引发原因等。
异常体系:
Throwable
|-------Error
|-------Exception
|-------RuntimeException
简单写了基本还有好多·····
2 异常的处理。
Java提供了特有的语句进行处理。
格式1:
Try
{
需要被检测的代码;
}
Catch(异常类 变量)
{
处理异常的代码:(处理方式)
}
Finally
{
一定会执行的语句
}
格式2:
Try
{
需要被检测的代码;
}
Catch(异常类 变量)
{
处理异常的代码:(处理方式)
}
格式3:
Try
{
需要被检测的代码;
}
Finally
{
一定会执行的语句
}
//记住:catch是用于处理异常,如果没有catch就代表异常没有没处理掉,如果该异常是检测异常要声明。
例题:
class Demo{
int dvs(int a ,intb){
return a/b;}
}
class ExceptionDemo {
public static void main(String[] args) {
/*最开始的语句
Demo d =newDemo();
intx=d.dvs(4,0);
System.out.println("x="+x);*/
Demo d= new Demo();
try{
int x=d.dvs(4,0);
System.out.println("x="+x);
}
catch (Exception A)
{
System.out.println("除数不为0");
System.out.println(A.getMessage());// / by zero;
System.out.println(A.toString());//异常名称:异常信息。
A.printStackTrace();//异常名称,异常信息。异常出现的位置。
//其实JVM异常处理机制默认就是printStackTrace方法
//打印异常的堆栈的跟踪信息。
}
3. 对捕获到的异常对象进行常见方法操作。
getMessage();//获取异常的信息。
toString();//异常名称:异常信息。
printStackTrace();//异常名称,异常信息。异常出现的位置。
//其实JVM异常处理机制默认就是printStackTrace方法
//打印异常的堆栈的跟踪信息。
在函数上声明异常。便于提高安全性,让调用出进行处理,不处理编译失败。
对多异常的处理
1 声明异常时,建议声明为具体的异常,这样处理的可以更有针对性。
如例句:
int Div(int a,intb)throws ArithmeticException, ArrayIndexOutOfBoundsException// 在功能上通过throws的关键字声明该功能有可能出现问题。
2. 对方声明几个异常,就对应有几个catch块。如果多个catch块中的异常出现继承关系,父类异常catch块放在最下面。
建议在进行catch处理时,catch一定要定义具体处理方式,不要简单定义一句e.printStackTrace(),也不要简单的书写一条输出语句。
当捕获到的异常,本功能处理不了时,可以继续在catch中抛出。如例题
try
{
throw newAException();
}
catch(AExeception a)
{
throw a;
}
如果该异常处理不了,但并不属于该功能出现的异常。
可以将异常转换后,再抛出和该功能相当异常。
或者异常可以处理,当需要将异常产生的和本功能相当的问题提供出去。
当调用者知道,并处理,也可以将捕获异常处理后,转换新的异常。如下例题
try
{
throw new AException();
}
catch (AException a)
{
throw new BException();
}
比如银行转账例子
自定义异常
1 当在函数内部出现了throw抛出异常对象,那么就必须要给对应的处理动作。
要么在内部try catch处理。
要么在函数上声明让调用者处理。
简明一句话:一般情况下,函数内出现异常,函数上需要声明。
2 自定义异常:
必须是自定义类继承Exception。或者RuntimeException
1为了让该自定义类具备可抛性。
2让该类具备操作异常的共性方法。
当要定义自定义异常的信息时,可以使用父类已经定义好的功能。
classMyException excends Exception
{
MyException(String message)
{
super(message);
}
}
继承Exception原因:
异常体系有一个特点:因为异常类和异常对象需要被抛出。
他么都具备可抛性。这个可抛性是Throwable这个体系中独有特点。
只有这个体系中的类和对象才可以被throw和throws操作。
3 throws和throw的区别
throws使用在函数上
throw使用在函数内
throws后面跟的是异常类,可以跟多个,用逗号隔开
throw后面跟的是异常对象。
注意:throw单独执行对象完毕,后面不要再加语句。因为执行不到。就像return后面不加语句一样。
RuntimeExceptiony异常
1 Exception中有一个特殊的子类异常RuntimeException运行时异常。
如果在函数内容抛出该异常,函数上可以不用声明。编译一样通过。
如果在函数上声明该异常,调用者可以不用进行处理,编译一样通过。
2 之所以不用在函数声明,是因为不需要让调用者处理。
当该异常发生,希望程序停止,因为在运行时,出现了无法继续运算的情况,希望停止程序后,对代码进行修正。
3 自定义异常时:如果该异常的发生,无法在继续进行运算,
就让自定义异常继承RuntimeException。
4 对于异常分两种:
(1)编译时被检测的异常。
(2)编译时不被检测的异常(运行时异常,RuntimeException以及其子类)
// 下面为另外一个RuntimeException例子
class FuShuException extends RuntimeException{
FuShuException(String message){
super(message);
}
}
class Demo{
int Div(int a,int b){
if(b<0)
throw new FuShuException("出现了除数为负数");
if(b==0)
throw new ArithmeticException("被零整除啦");
return a/b;
}
}
class ExceptionDemo5{
public static void main(String[] args) {
Demo d = new Demo();
int x = d.Div(4,-1);
System.out.println(x);
}
}
Finally最终都会执行的语句(一定要记住这条哦)
假设:
class NoException
{
}
public void method()throws NoEception
{
连接数据库;
数据操作://shrow new SQLException();
关闭数据库://该动作,无论数据操作是否成功,一定要关闭资源。
}
try
{
连接数据库;
数据操作:
}
catch(SQlEception a)
{
会对数据库进行一次处理;
throw new NoException();
//抛出对外暴露可以识别的另外一个错误.
//比方说外部的销售科员要拿货这里的catch是仓
//库员处理的内容,他要处理货物的事情,因为销//售员只要知道有没有货,其他不是他的工作范
//围,那么catch仓库员就只抛出一个问题:就是
//告知销售员没货的问题就可以了。这就叫问题的封装
}
finally
{
关闭数据库
}
Finally代码块:定义一定执行的代码。通常用于关闭资源。
一种情况会执行不到就是在catch语句中定义了
System.exit(0); //属于系统退出。执行不到finally咯
异常在子父类覆盖中的体现。
1, 子类在覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法,只能抛出父类的异常或者该异常的子类。或者不抛。(只延续父类或者有关父类的zi问题。)
2, 如果父类抛出多个异常,那么子类在覆盖方法时,只能抛出父类异常的子集。(只要父类有)
3, 如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法时也不可以抛出异常, 日过子类方法发生了异常,就必须得try啦。决定不能抛。
应用题:
/*
有一个圆形和长方形,
都可以获取面积,对于面积如果出现非法的数值,视为是获取面积出现问题。问题用异常表示
现在对这个程序进行基本设计
*/
class NovalueException extends RuntimeException//原本继承Exception
{
NovalueException(Stringmessage){
super(message);
}
}
interface Shape{
void getArea();
}
class Rec implements Shape
{
private intlen,wid;
Rec(int len,intwid)//throws NovalueException//throws NovalueException之前没有RuntimeException需要加的
{
if(len<=0|| wid<=0)
thrownew NovalueException("非法数值");
this.len=len;
this.wid=wid;
}
public void getArea()
{
System.out.println(len*wid);
}
}
class Circle implements Shape
{
private int radius;
public static finaldouble PI =3.14;
Circle(int radius)
{
if(radius<=0)
throw new NovalueException("数值非法");//RuntimeException("数值非法");不如自定义的好
this.radius =radius;
}
public void getArea()
{
System.out.println(radius*radius*PI);
}
}
class ExceptionDemo{
public static voidmain(String[] args) {
/*最开始的句子
try
{
Recr=new Rec(2,5);
r.getArea();
}
catch(NovalueException a)
{
System.out.println(a.toString());
}
*/
Rec r=new Rec(2,5);
r.getArea();
Circle c=new Circle(-6);
c.getArea();
System.out.println("程序结束");
}
}
---------------------- 黑马程序员 Android培训、期待与您交流! ----------------------