黑马程序员—异常知识汇总


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


一、异常概述

异常:就是程序在运行时出现的不正常的情况。

异常的由来:不正常的情况即问题,也是现实生活中的一个具体事务,可以通过面向对象的思想。

通过java的类的形式进行描述。并封装成对象。异常其实就是java对不正常情况进行描述后的对象的体现。


对于异常问题的划分有两种:一种是严重问题,一种是非严重问题。

对于严重的问题:java通过Error类进行描述。对于Error一般不编写针对性的代码对其进行处理。

对于非严重的问题:java通过Exception类进行描述。对于Exception可以用针对性的处理方式对其进行处理。

无论是Error还是Exception都具有一些共性,比如:不正常情况的信息、引发原因。

所以它们有一个父类Throwable。

异常体系:

Throwable  父

|—Error 严重

|—Exception 非严重

|—RuntimeException  Runtime异常比较特殊,它与它的子类不会在编译时报异常只在运行期报异常。


异常声明 throws:

在功能上通过throws的关键字声明该功能有可能会出现问题。加了throws关键字后如果不对错误进行预先处理,则编译不通过。



二、异常的处理

异常的处理:java提供了特有的语句进行异常处理

try{

需要被检测代码;

}

catch(异常类 变量)

{

处理方式即处理异常代码;

}

finally

{

一定执行的语句,一般用于释放资源。但是如果在他前面有System.exit(0)的话则执行不到,以为已经退出了虚拟机。

}

异常的处理方式有两种

1,把错误抛出给虚拟机处理

2,自己用try,catch接受异常。自己处理。


处理异常代码例:

处理方式1:抛出错误

class Demo

{

int div(int a, int b)

{

return a/b;//如果这里传入的参数有误系统则会自动产出一个异常对象

}

}

class ExceptionDemo

{

public static void main(String[] args)throws Exception   //抛出错误给虚拟机。

{

Demo d = new Demo();

}

}

处理方式2:接收

class ExceptionDemo

{

public static void main(String[] args) 

try

{

Demo d = new Demo();

}

catch(Exception e)

{

S.o.p(e.toString); //这里是演示所以简单的写了一个输出语句

}

}

建议在进行catch处理时,catch中一定要定义具体处理方式。

不要简单定义输出语句与printStackTrack();方法(打印异常的堆栈信息)


三、多异常的处理

对多异常处理:

1.声明异常时,建议声明更为具体的异常。这样处理的更具体。

2.对方声明几个异常就对应几个catch块来处理。不要定义多余的catch块。

注意如果多个catch块中的异常出现继承关系,那么父类异常一定要放到最下面。

因为如果放到了最上面那么所有异常都走的是父类异常的处理方式。

多异常处理例:

class Demo
{
int div(int a,int b) throws ArithmeticException,ArrayIndexOutOfBoundsException//在功能上通过throws的关键字声明了该功能有可能会出现问题。
{
int[] arr = new int[a];
System.out.println(arr[4]);
return a/b; //如果这里出现问题就会产生 new () AritchmeticException
//把问题封装成一个对象。该问题已经有描述。所有能创建对象。(已经有父类)。

}
}


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

try
{
int x = d.div(4,0); 
System.out.println("x="+x);
}
catch (ArithmeticException e)//多异常分别catch处理
{
System.out.println(e.toString());
System.out.println("被零除了!!");
}
catch (ArrayIndexOutOfBoundsException e)
{
System.out.println(e.toString());
System.out.println("角标越界了!!");
}


四、自定义异常

因为项目中会出现特有的问题。而这些问题并未能被java所描述并封装对象。所以对于这些特有的问题可以按照java

面向对象的思想。将特有的问题进行自定义的异常封装。

自定义异常:必须是自定义类而且继承了Exception。因为异常体系才具有可抛性,可抛性是Throwable独有的特点。

只有在它的体系中的类与对象才可以被throws与throw操作。

自定义异常:

class FuShuException extends Excepiton

{

private int value;

FuShuExcepitoni(String msg,int value)

{

super(msg);

this.value= value;

}

public  int getValue()

{

return value;

}


}

class Demo

{

ind div(int a,int b) throws FuShuException

{

if(b<0||a<0)

throw newFuShuException("出现了负数异常",b);

return a/b;

}

}

class ExceptionDemo2

{

public static void main(String [] args)

{

Demo d = new Demo();

try

{

int x = d.div(-1,3);

}

catch(FuShuException e)

{

S.o.p("出现负数异常"+e.getValue());

}

}

}

五、RuntimeException

Exception类中有一个特殊的子类异常。如果在函数内容抛出该异常。

函数上可以不声明。编译可以通过。如果在函数上声明该异常。

调用者可以不用处理。之所以不用在函数上声明是因为不用调用者处理。

当该异常发生,希望程序停止。因为在运行时,出现了无法继续运行的情况。

希望停止程序后,对代码进行修正。

自定义异常时,如果该异常的发生。无法在继续运行运算。

就让自定义异常类继承RuntimeException


对于异常分两种:

1,编译时被检测的异常:Exception

2,编译时不被检测的异常:RuntimeException及其子类。


六、异常总结

异常:

是什么?是对问题的描述。将问题进行对象的封装。


throw和throws的用法:
throw定义在函数内,用于抛出异常对象。
throws定义在函数上,用于抛出异常类,可以抛出多个用逗号隔开。


异常的注意事项:
在子类覆盖时:
1,子类抛出的异常必须是父亲的异常的子类或者子集。
2,如果父类或者接口没有异常抛出时,子类覆盖出现异常,只能try不能抛。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值