首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >6:异常处理

6:异常处理

作者头像
六月的雨
发布2018-05-14 10:19:14
5770
发布2018-05-14 10:19:14
举报
文章被收录于专栏:Android开发指南Android开发指南

异常处理

异常:是在运行时期发生的不正常情况。在java中用类的形式对不正常情况进行了描述和封装对象。 

描述不正常的情况的类,就称为异常类。  

以前正常流程代码和问题处理代码相结合, 现在将正常流程代码和问题处理代码分离。提高阅读性.

其实异常就是java通过面向对象的思想将问题封装成了对象.用异常类对其进行描述。

不同的问题用不同的类进行具体的描述。 比如角标越界。空指针等等。

问题很多,意味着描述的类也很多,将其共性进行向上抽取,形成了异常体系。

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

 |--1,一般不可处理的。Error

   特点:是由jvm抛出的严重性的问题。

     这种问题发生一般不针对性处理。直接修改程序

 |--2,可以处理的。Exception

该体系的特点:

 子类的后缀名都是用其父类名作为后缀,阅读性很想。

异常可分为俩类

Error:jvm系统内部错误,我们对Error无能为力

Exception:编程错误或偶然的外在因素导致的一般性问题

Exception分非检查异常(RuntimeException)和检查异常

RuntimeException:空指针异常、数组下标越界异常、类型转换异常、算术异常

检查异常:编译时异常,即编写代码时就要求处理的异常

Throwable:无论是error,还是异常,问题,问题发生就应该可以抛出,让调用者知道并处理。

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

   可抛性到底指的是什么呢?怎么体现可抛性呢?

   其实是通过两个关键字来体现的。

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

throws 和throw的区别。 

1,throws使用在函数申明上。 

   throw使用在函数内。

2,throws抛出的是异常类,可以抛出多个,用逗号隔开。

   throw抛出的是异常对象。

throws是用来声明一个方法可能抛出的所有异常信息
throw则是指抛出的一个具体的异常类型。
通常在一个方法(类)的声明处通过throws声明方法(类)可能抛出的异常信息,而在方法(类)内部通过throw声明一个具体的异常信息。
throws通常不用显示的捕获异常,可由系统自动将所有捕获的异常信息抛给上级方法;
throw则需要用户自己捕获相关的异常(try---catch),而后在对其进行相关包装,最后在将包装后的异常信息抛
//异常标准写法:  public Test() throws RepletException {    try {      System.out.println("Test this Project!")    }    catch (Exception e) {      throw new Exception(e.toString());    }  }

负数角标这种异常在java中并没有定义过。

那就按照java异常的创建思想,面向对象,将负数角标进行自定义描述。并封装成对象。

这种自定义的问题描述成为自定义异常。  

注意:如果让一个类称为异常类,必须要继承异常体系,因为只有称为异常体系的子类才有资格具备可抛性

 才可以被两个关键字所操作,throws throw

自定义异常时,要么继承Exception。要么继承RuntimeException。

如果继承exception则需要在函数处用throws抛出,继承了RuntimeException可以不用这样

Exception和RuntinmeException

class FuShuIndexException extends Exception {	FuShuIndexException() {	}	FuShuIndexException(String msg) {		super(msg);	}}class Demo {	public int method(int[] arr, int index) throws NullPointerException// FuShuIndexException	{		if (arr == null)			throw new NullPointerException("数组的引用不能为空!");		if (index >= arr.length) {			throw new ArrayIndexOutOfBoundsException("数组的角标越界啦,哥们,你是不是疯了?:"					+ index);		}		if (index < 0) {			throw new FuShuIndexException("角标变成负数啦!!");		}		return arr[index];	}}class ExceptionDemo {	public static void main(String[] args) throws FuShuIndexException// NullPointerException	{		int[] arr = new int[3];		Demo d = new Demo();		int num = d.method(null, -30);		System.out.println("num=" + num);		System.out.println("over");	}}

异常处理的捕捉形式:

这是可以对异常进行针对性处理的方式。

具体格式是: 

try 

{

 //需要被检测异常的代码。

}

catch(异常类 变量FuShuIndexException e)

//该变量用于接收发生的异常对象,抛什么就catch什么

{

 //处理异常的代码。

}

finally

{

 //一定会被执行的代码。

}

异常处理的原则: 

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

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

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

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

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

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

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

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

class ExceptionDemo {	public static void main(String[] args) {		int[] arr = new int[3];		Demo d = new Demo();		try {			int num = d.method(null, -1);			System.out.println("num=" + num);		} catch (NullPointerException e) {			System.out.println(e.toString());		} catch (FuShuIndexException e) {			System.out.println("message:" + e.getMessage());			System.out.println("string:" + e.toString());			e.printStackTrace();// jvm默认的异常处理机制就是调用异常对象的这个方法。			System.out.println("负数角标异常!!!!");		}		//多catch父类的catch放在最下面		 catch(Exception e) { }				System.out.println("over");	}}

需要注意的:

异常处理try....catch

异常抛出过程

finally通常用于关闭(释放)资源。

/*

连接数据库 

查询。Exception

关闭连接。

*/ 

try catch finally 代码块组合特点:

1, try catch finally

2, try catch(多个)当没有必要资源需要释放时,可以不用定义finally。

3, try finally 异常无法直接catch处理,但是资源需要关闭。

void show()throws Exception { try {  //开启资源。  throw new Exception(); } finally {  //关闭资源。 }

异常的注意事项:

1,子类在覆盖父类方法时,父类的方法如果抛出了异常, 

那么子类的方法只能抛出父类的异常或者该异常的子类。

2,如果父类抛出多个异常,那么子类只能抛出父类异常的子集。 

简单说:子类覆盖父类只能抛出父类的异常或者子类或者子集。  

注意:如果父类的方法没有抛出异常,那么子类覆盖时绝对不能抛,就只能try .

异常处理机制:

异常处理的标准结构:

class Exception {	public static int div(int x, int y) {// 异常由被调用者处理		int result = 0;		System.out.println("1.除法计算开始,打开计算功能");		try {			result = x / y;		} catch (java.lang.Exception e) {			throw e;		} finally {			System.out.println("2.除法计算结束,关闭计算功能");		}		return result;	}	public static void main(String[] args) {		try {			System.out.println("除法计算结果:" + div(10, 0));		} catch (java.lang.Exception e) {			e.printStackTrace();		}	}}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015-10-26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档