6:异常处理

异常处理

异常:是在运行时期发生的不正常情况。在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();		}	}}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IMWeb前端团队

JavaScript强化教程——使用误区

本文为 H5EDU 机构官方 HTML5教程,主要介绍:JavaScript强化教程 —— 使用误区 JavaScript使用误区 本章节我们将讨论 JavaS...

1996
来自专栏Modeng的专栏

Javascript数组系列四之数组的转换与排序Sort方法

今天我们继续来介绍 Javascirpt 数组中的方法,也是数组系列的第四篇文章,因为数组的方法众多,每篇文章我们都对数组的每个方法都有比较细致的描述,只要你能...

901
来自专栏工科狗和生物喵

【计算机本科补全计划】Java学习笔记(四) 修饰符

正文之前 今天总算是把那个党员谈话给弄完了,三个学弟轮番跟我来聊天,讲自己的入党动机啥的,看到他们就仿佛看到了大一的自己,原来当时面对学长,面对这类事情,会紧张...

3389
来自专栏农夫安全

python爬虫基础之正则表达式

Python基础前期后后看了五六遍,除了能读懂一些简单的代码,一直也没有进阶。 这次借助一个爬虫教学视频。把学习中的一些重点写下来,一个是自己巩固,一个是也帮助...

4347
来自专栏kevindroid

JNI所需的C语言知识小结

1645
来自专栏编程

轻松学Python,一篇文章带你快速入门

Python基础01 Hello World! ? Python命令行 假设你已经安装好了Python, 那么在命令提示符输入: python 将直接进入pyt...

2127
来自专栏landv

Java对象和类

2074
来自专栏Java帮帮-微信公众号-技术文章全总结

Java基础-day10-基础题-继承;抽象类

Java基础-day10-基础题-继承&抽象类 什么是继承?继承有什么好处? 继承是面向对象最显著的一个特性。继承是从已有的类中派生出新的类,新的类能吸收已有类...

3716
来自专栏玄魂工作室

如何学python 第10课 创建自己的函数

在上一节课里,我们学习了一些关于错误检测和错误处理的知识。这节课我们来学习函数。我们将会介绍什么是函数,以及如何创建函数。 函数是什么? 函数是一系列指令的集合...

26712
来自专栏思考的代码世界

Python编程从入门到实践之函数|第8天

函数是带名字的代码块,用于完 成具体的工作。要执行函数定义的特定任务,可调用该函数。需要在程序中多次 执行同一项任务时,你无需反复编写完成该任务的代码,而只需调...

3557

扫码关注云+社区

领取腾讯云代金券