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

黑马程序员 Java面向对象<三> 异常

2014-06-21 14:16 274 查看
----------
android培训、java培训、期待与您交流! ----------

       写程序避免不鸟出现bug,java也不例外。但它不同与其他语言的是,java提供了一套处理机制,用于处理这些bug。也就是java的异常处理机制

   它是基于面向对象思考的将问题封装成了对象。

异常

  定义:   

     就是不正常。程序在运行时出现的不正常情况。其实就是程序中出现的问题。这个问题按照面向对象思想进行描述,并封装成了对象。

  因为问题的产生有产生的原因、有问题的名称、有问题的描述等多个属性信息存在。当出现多属性信息最方便的方式就是将这些信息进行封装。

  异常就是java按照面向对象的思想将问题进行对象封装。这样就方便于操作问题以及处理问题。

    出现的问题有很多种,比如角标越界,空指针等都是。就对这些问题进行分类。

   而且这些问题都有共性内容比如:每一个问题都有名称,同时还有问题描述的信息,问题出现的位置,所以可以不断的向上抽取。形成了异常体系。 

  异常体系

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

   Throwable:可抛出的。 

      //该体系的特点就在于Throwable及其所有的子类都具有可抛性

        |--Error:错误,一般情况下,不编写针对性的代码进行处理,通常是jvm发生的,需要对程序进行修正。

        |--Exception:异常,可以有针对性的处理方式 

      通过throws throw 凡是可以被这两个关键字所操作的类和对象都具备可抛性.

// 常见异常
public class Temp
{
public static void main(String[] args)
{
int[] arr = new int[3];
//System.out.println(arr[3]);//java.lang.ArrayIndexOutOfBoundsException: 角标越界
arr = null;
//System.out.println(arr[1]);//java.lang.NullPointerException 空指针异常

int a =0,b = 2;
System.out.println(b/a);//java.lang.ArithmeticException: / by zero 算数异常
}

}
  

   可处理的Exception

    1、在运行时运行出现的一些情况,可以通过 try catch finally

    2、通过throws在函数上声明。(如果函数内throw异常,那么函数就必须声明)

   异常:是在运行时期发生的不正常情况

   异常处理几种格式

  

/*
格式一:

try{

可能发生异常的代码;
}

catch(接收捕获异常类的对象 异常类引用变量){

处理代码;
}

格式二:

try{

可能发生异常的代码;

}
fianlly{

一定要执行的语句;(通常用于关闭资源)
}

格式三:

try{

可能发生异常的代码;

}

catch(捕获异常类的对象 异常类引用变量){

处理代码;

}

finally{

一定要执行的语句;(通常用于关闭资源)

}
*/

public class Temp
{
public static void main(String[] args)
{
int[] arr = {1,3,5,7};

try{

System.out.println(arr[5]);

}
catch (Exception e){

System.out.println("数组角标越界");

}

finally{
System.out.println("return 之前必须执行");
return ;
}

}

}


   throw 和 throws关键字的区别

   throw 用于抛出异常对象,后面跟的是异常对象;throw用在函数内。

   throws用于抛出异常类,后面跟的异常类名,可以跟多个,用逗号隔开。throws用在函数上。

   通常情况:函数内容如果有throw,抛出异常对象,并没有进行处理,那么函数上一定要声明,否则编译失败。但是也有特殊情况。

   异常分两种

  1、编译时被检查的异常,只要是Exception及其子类都是编译时被检测的异常。

  2、运行时异常,其中Exception有一个特殊的子类RuntimeException,以及RuntimeException的子类是运行异常,也就说这个异常是编译时不被检查的异常

 

  编译时被检查的异常和运行时异常的区别

  编译被检查的异常在函数内被抛出,函数必须要声明,否编译失败。

  声明的原因:是需要调用者对该异常进行处理。

  运行时异常如果在函数内被抛出,在函数上不需要声明。

  不声明的原因:不需要调用者处理,运行时异常发生,已经无法再让程序继续运行,所以,不让调用处理的,直接让程序停止,由调用者对代码进行修正

  异常处理的原则

  1、函数内容如果抛出需要检测的异常,那么函数上必须要声明。

     否则必须在函数内用trycatch捕捉,否则编译失败。

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

  3、什么时候catch,什么时候throws 呢?

      功能内容可以解决,用catch。

      解决不了,用throws告诉调用者,由调用者解决 。

  4、什么时候定义try,什么时候定义throws呢

       功能内部如果出现异常,如果内部可以处理,就用try;

       如果功能内部处理不了,就必须声明出来,让调用者处理。

  5、一个功能如果抛出了多个异常,那么调用时,必须有对应多个catch进行针对性的处理。

     内部又几个需要检测的异常,就抛几个异常,抛出几个,就catch几个。

 例子

/*
有个圆形和长方形,都可以获取面积,对于面积若出现非法数值,是为获取面积出问题
问题通过异常来表示
*/
//创建输入值错误的异常
class NoValueException extends RuntimeException//对问题名称的描述,更具体
{
NoValueException(String message)
{
super(message);
}
}
//创建接口,抽取获取面积方法
interface ShapeArea
{
void getArea();
}
//创建获取长方形面积的类
class Rec implements ShapeArea
{
private int len,wid;
//此处声明了,就会将问题抛给主函数中解决
Rec(int len,int wid)throws NoValueException
{
if (len<=0 || wid<=0)
throw new NoValueException("出现非法值了");
this.len = len;
this.wid = wid;
}
public void getArea()
{
System.out.println(len*wid);
}

}
//创建获取圆形面积的类
class Circle implements ShapeArea
{
private int rad;
private static final double PI = 3.14;
//此处未声明,当调用该函数,发生异常时会直接结束程序,并打印具体的异常信息
Circle(int rad)
{
if (rad<=0)
throw new NoValueException("出现非法值了");
this.rad = rad;
}
public void getArea()
{
System.out.println(rad*rad*PI);
}

}
//测试
class Temp
{
public static void main(String[] args)
{
//方式一:出现异常时,信息不具体
try
{
Rec r= new Rec(-3,4);
r.getArea();
}
catch (NoValueException e)
{
System.out.println(e.toString());
}
System.out.println("OVER");
//方式二:出现异常时,信息更具体
Circle c = new Circle(-8);
c.getArea();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java