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

---------- 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();  
    }  
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值