您的位置:首页 > 职场人生

黑马程序员_异常

2015-06-07 23:28 204 查看
------- android培训、java培训、期待与您交流! ----------

异常

第一部分

1、异常概念

异常就是不正常,是指程序在运行时出现的不正常情况;

2、异常的由来

问题也是现实生活中一个具体的事物,也可以通过java的类的形式进行描述,并封装成对象;其实就是java对不正常情况进行描述后的对象体现;

3、异常问题的划分

|--严重的问题:java通过Error类进行描述;

|--对于Error一般不编写针对性的代码对其进行处理;

|--非严重的问题:java通过Exception类进行描述;

|--对于Exception可以使用针对性的处理方式进行处理;

|--两种问题都有共性的内容;-->它们两者就不断的向上抽取,抽取的父类是Throwable;

|--就是不正常的信息,引发原因等;

|--Throwable

|--Error

|--Exception

4、异常的处理

java提供了特有的语句进行处理;

<span style="font-size:14px;">try
{
需要被检测的代码;
}
catch ()
{
处理异常的代码;(处理方式)
}
finally
{
一定会执行的语句;
}</span>

5、对异常对象操作

|--String getMessage()

|--打印异常信息;

|--String toString()

|--打印异常信息的字符串表现形式:异常名称:异常信息

|--void printStackTrace()

|--打印堆栈中的跟踪信息;异常名称,异常信息,异常出现的位置
|--其实jvm默认的异常处理机制,就是在调用printStackTrace()方法;

6、对异常的第二种处理

|--就是在功能上加一个标识,意思就是说,在功能上通过throws的关键字来声明了该功能有可能会出现问题;
|--但是一般不往外抛,捕捉才是硬道理;

7、对多个异常的处理

|--声明异常时,建议声明更为具体的异常,这样处理的更加具体;

|--对方声明几个异常,就对应有几个catch块,不要定义多余的catch块,如果多个catch块中的异常出现继承关系,父类异常catch块放在最下面。

8、异常注意事项

|--当异常被捕捉了以后,会处理好异常后,下面的语句还会继续执行;
|--当函数中只要已有异常发生,那么这个函数就已经结束了,换句话说就是不在继续执行其他的程序了;
|--异常不能同时发生;
|--看上面的功能中有几个异常,那么就对应的有几个catch;

|--如果发生了功能以外了异常,那么父类的catch块放在最下面;

|--建议在进行catch处理时,catch中一定要定义具体的处理方式,也不要简单的写一句输出语句;
|--如果真的发生问题了,把这个信息会有一个硬盘文件把这个异常信息记录下来,这个文件称为异常日志文件;

第二部分

1、自定义异常

|--由于在项目中会出现特有的问题,而这些问题并未被java所描述并封装对象,所以对于这些特有的问题可以按照java的对问题封装的思想,将特有的问题进行自定义的异常封装;

|--在自定义异常是必须要继承Exception;

|--原因:异常体系有个特点:因为异常类和异常对象都需要被抛出,它们都具备可抛性,这个可抛性是Throwable这个体系中的独有特点,只要这个体系中的类和对象才可以被throws和throw操作,只有Throwable体系中的成员,草可以被throws和throw操作;

|--throws和throw的区别:

|--throws使用在函数上,并且后面跟的异常类,可以跟多个,用逗号隔开

|--throw使用在函数内;后面跟的是异常对象;

|--在自定义异常时:如果该异常的发生,无法在继续进行运算,就让自定义异常继承RuntimeException;

2、需求

在本程序中,对于除数是负数,也视为是错误的是无法进行运算的,那么就需要对这个问题进行自定义的描述;
代码体现:

//要先进入Exception体系中
class FuShuException extends Exception
{
private int value;
FuShuException(String msg,int value)//父类已经做完了,那么子类就直接拿过来用就可以了
{
super(msg);
this.value = value;
}
public int getValue()
{
return value;
}
}
class Demo
{
int div(int a,int b)throws FuShuException//手动通过throw关键字抛出一个自定义异常对象
{
if(b<0)
throw new FuShuException("出现除数为负数了----/by fushu",b);
return a/b;
}
}
class ExceptionDemo3
{
public static void main(String[] args)
{
Demo d = new Demo();
try
{
int x = d.div(4,-2);
System.out.println("X="+x);

}
catch (FuShuException e)
{
System.out.println(e.toString());
System.out.println("错误的负数是:"+e.getValue());
System.out.println("除数出现负数了!");
}
}
}


3、运行的结果



4、注意

|--当在函数内部出现了throw抛出异常对象,那么就必须要给对应的处理动作,要么在内部try catch处理,要么在函数上声明让调用者处理;;
|--一般情况下,函数内出现异常,函数上需要声明;

5、如何自定义异常信息

因为父类中已经把异常信息的操作已经完成了,因此子类只要在构造时,将异常信息传递给父类通过super语句,那么就可以直接通过getMessage方法获取自定义的异常信息;

第三部分

1、RuntimeException:运行是异常

|--RuntimeException:这是异常子类是一个非常特殊的,如果在这个RuntimeException或者RuntimeException的子类在函数内抛出了,那么函数上就不要声明了;
|--如果在函数上声明 了该异常,调用者可以不用进行处理,编译一样通过;
|--之所以不用在函数上声明,是因为不需要让调用者处理,当该异常发生了,希望程序停止,因为在运行时,出现了无法继续运算的情况,希望停止程序后,有程序员对代码进行修正;

2、代码体现

//如果该异常的发生,无法在继续进行运算,
//就让自定义异常继承RuntimeException;
class FuShuException extends RuntimeException
{
//	private String msg;
FuShuException(String msg)
{
super(msg);
}
}
class Demo
{
int div(int a,int b)
{
if(b<0)
throw new FuShuException("除数出现负数了");
if(b==0)
throw new ArithmeticException("除数为零了");
return a/b;
}
}
class ExceptionDemo4
{
public static void main(String[] args)
{
Demo d = new Demo();
int x = d.div(4,0);
System.out.println("X="+x);
}
}

3、运行结果



在运行时,出现了无法继续运算的情况,希望停止程序后,有程序员对代码进行修正;

4、对于异常分为两种

|--编译时被检测的异常;
|--编译时不被检测的异常(运行时异常,RuntimeException或者RuntimeException的子类);

第四部分:

我的总结

|--Java异常其实是对不正常情况的一种描述,并将其封装成对象;

|--Java在设计异常体系时,将容易出现的异常情况都封装成了对象。

|--Exception 和 Error的子类名大都是以父类名作为后缀。

|--捕获异常:先捕获小异常再捕获大异常。

|--异常处理后,程序不会因为出现异常而退出。

|--finally代码块只在一种情况下不执行:System.exit(0);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: