java 异常二
一 捕获异常try…catch…finally
捕获:Java中对异常有针对性的语句进行捕获,可以对出现的异常进行指定方式的处理
捕获异常格式:
try {
//需要被检测的语句。
}
catch(异常类 变量) { //参数。
//异常的处理语句。
}
finally {
//一定会被执行的语句。
}
try:该代码块中编写可能产生异常的代码。
catch:用来进行某种异常的捕获,实现对捕获到的异常进行处理。
finally:有一些特定的代码无论异常是否发生,都需要执行。另外,因为异常会引发程序跳转,导致有些语句执行不到。
而finally就是解决这个问题的,在finally代码块中存放的代码都是一定会被执行的。
- class ExceptionDemo{
- public static void main(String[] args){ //throws ArrayIndexOutOfBoundsException
- try {
- int[] arr = new int[3];
- System.out.println( arr[5] );// 会抛出ArrayIndexOutOfBoundsException
- 当产生异常时,必须有处理方式。要么捕获,要么声明。
- }
- catch (ArrayIndexOutOfBoundsException e) { //括号中需要定义什么呢?try中抛出的是什么异常,在括号中就定义什么异常类型。
- System.out.println("异常发生了");
- } finally {
- arr = null; //把数组指向null,通过垃圾回收器,进行内存垃圾的清除
- }
- System.out.println("程序运行结果");
- }
- }
二 try…catch…finally异常处理的组合方式
try catch finally组合:检测异常,并传递给catch处理,并在finally中进行资源释放。
try catch组合 : 对代码进行异常检测,并对检测的异常传递给catch处理。对异常进行捕获处理。
- void show(){ //不用throws
- try{
- throw new Exception();//产生异常,直接捕获处理
- }catch(Exception e){
- //处理方式
- }
- }
一个try 多个catch组合 : 对代码进行异常检测,并对检测的异常传递给catch处理。对每种异常信息进行不同的捕获处理。
void show(){ //不用throws
try{
throw new Exception();//产生异常,直接捕获处理
}catch(XxxException e){
//处理方式
}catch(YyyException e){
//处理方式
}catch(ZzzException e){
//处理方式
}
}
注意:这种异常处理方式,要求多个catch中的异常不能相同,并且若catch中的多个异常之间有子父类异常的关系,那么子
类异常要求在上面的catch处理,父类异常在下面的catch处理。
try finally 组合: 对代码进行异常检测,检测到异常后因为没有catch,所以一样会被默认jvm抛出。异常是没有捕获处理
的。但是功能所开启资源需要进行关闭,所有finally。只为关闭资源。
- void show(){//需要throws
- try{
- throw new Exception();
- }finally {
- //释放资源
- }
- }
三 运行时期异常
RuntimeException和他的所有子类异常,都属于运行时期异常。NullPointerException,ArrayIndexOutOfBoundsException
等都属于运行时期异常.
运行时期异常的特点:
方法中抛出运行时期异常,方法定义中无需throws声明,调用者也无需处理此异常
运行时期异常一旦发生,需要程序人员修改源代码.
- class ExceptionDemo{
- public static void main(String[] args){
- method();
- }
- public static void method(){
- throw new RuntimeException();
- }
- }
四 异常在方法重写中细节
子类覆盖父类方法时,如果父类的方法声明异常,子类只能声明父类异常或者该异常的子类,或者不声明。
- class Fu {
- public void method () throws RuntimeException {
- }
- }
- class Zi extends Fu {
- public void method() throws RuntimeException { } //抛出父类一样的异常
- //public void method() throws NullPointerException{ } //抛出父类子异常
- }
当父类方法声明多个异常时,子类覆盖时只能声明多个异常的子集。
- class Fu {
- public void method () throws NullPointerException, ClassCastException{
- }
- }
- class Zi extends Fu {
- public void method()throws NullPointerException, ClassCastException { } public void method() throws NullPointerException{ } //抛出父类异常中的一部分
- public void method() throws ClassCastException { } //抛出父类异常中的一部分
- }
当被覆盖的方法没有异常声明时,子类覆盖时无法声明异常的。
- class Fu {
- public void method (){
- }
- }
- class Zi extends Fu {
- public void method() throws Exception { }//错误的方式
- }
- interface Inter {
- public abstract void method();
- }
- class Zi implements Inter {
- public void method(){ //无法声明 throws Exception
- int[] arr = null;
- if (arr == null) {
- //只能捕获处理
- try{
- throw new Exception(“哥们,你定义的数组arr是空的!”);
- } catch(Exception e){
- System.out.println(“父方法中没有异常抛出,子类中不能抛出Exception异常”);
- //我们把异常对象e,采用RuntimeException异常方式抛出
- throw new RuntimeException(e);
- }
- }
- }
- }
五 异常中常用方法
getMessage方法:返回该异常的详细信息字符串,即异常提示信息
toString方法:返回该异常的名称与详细信息字符串
printStackTrace:在控制台输出该异常的名称与详细信息字符串、异常出现的代码位置
- try {
- Person p= null;
- if (p==null) {
- throw new NullPointerException(“出现空指针异常了,请检查对象是否为null”);
- }
- } catch (NullPointerException e) {
- String message = e.getMesage();
- System.out.println(message );
- String result = e.toString();
- System.out.println(result);
- e.printStackTrace();
- }
六 自定义异常
java中所有的异常类,都是继承Throwable,或者继承Throwable的子类。这样该异常才可以被throw抛出。
说明这个异常体系具备一个特有的特性:可抛性:即可以被throw关键字操作。
并且查阅异常子类源码,发现每个异常中都调用了父类的构造方法,把异常描述信息传递给了父类,让父类帮我们进行异常信息的封装。
例如NullPointerException异常类源代码:
- public class NullPointerException extends RuntimeException {
- public NullPointerException() {
- super();//调用父类构造方法
- }
- public NullPointerException(String s) {
- super(s);//调用父类具有异常信息的构造方法
- }
- }
自定义异常格式:
Class 异常名 extends Exception{ //或继承RuntimeException
public 异常名(){
}
public 异常名(String s){
super(s);
}
}
自定义异常继承Exception演示
- class MyException extends Exception{
- /*
- 为什么要定义构造函数,因为看到Java中的异常描述类中有提供对异常对象的初始化方法。
- */
- public MyException(){
- super();
- }
- public MyException(String message) {
- super(message);// 如果自定义异常需要异常信息,可以通过调用父类的带有字符串参数的构造函数即可。
- }
- }
自定义异常继承RuntimeException演示
- class MyException extends RuntimeException{
- /*
- 为什么要定义构造函数,因为看到Java中的异常描述类中有提供对异常对象的初始化方法。
- */
- MyException(){
- super();
- }
- MyException(String message) {
- super(message);// 如果自定义异常需要异常信息,可以通过调用父类的带有字符串参数的构造函数即可。
- }
- }
java 异常二的更多相关文章
- Java异常(二) 《Effective Java》中关于异常处理的几条建议
概要 本章是从<Effective Java>摘录整理出来的关于异常处理的几条建议.内容包括:第1条: 只针对不正常的情况才使用异常第2条: 对于可恢复的条件使用被检查的异常,对于程序错误 ...
- Java异常(三) 《Java Puzzles》中关于异常的几个谜题
概要 本章介绍<Java Puzzles>中关于异常的几个谜题.这一章都是以代码为例,相比上一章看起来更有意思.内容包括:谜题1: 优柔寡断谜题2: 极端不可思议谜题3: 不受欢迎的宾客谜 ...
- Java异常系列
Java异常(一) Java异常简介及其架构 Java异常(二) <Effective Java>中关于异常处理的几条建议 Java异常(三) <Java Puzzles>中关 ...
- java提高篇(十七)-----异常(二)
承接上篇博文:java提高篇-----异常(一) 五.自定义异常 Java确实给我们提供了非常多的异常,但是异常体系是不可能预见所有的希望加以报告的错误,所以Java允许我们自定义异常来表 ...
- “全栈2019”Java异常第二十二章:try-with-resources语句详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...
- “全栈2019”Java异常第十二章:catch与异常匹配
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...
- 浅谈java异常[Exception]
学习Java的同学注意了!!! 学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:589809992 我们一起学Java! 一. 异常的定义 在<java编程思想 ...
- 黑马----JAVA异常
黑马程序员:Java培训.Android培训.iOS培训..Net培训 黑马程序员--JAVA异常 一.JAVA异常有三种语句块:try语句块.catch语句块.finally语句块. 1.try语句 ...
- [Java面试二]Java基础知识精华部分.
一:java概述(快速浏览): 1991 年Sun公司的James Gosling等人开始开发名称为 Oak 的语言,希望用于控制嵌入在有线电视交换盒.PDA等的微处理器: 1994年将Oak语言更名 ...
随机推荐
- Go的100天之旅-01初识Go
初识Go Go简介 Go的历史 上个世纪70年代Ken Thompson和Dennis M. Ritchie合作发明了UNIX操作系统同时Dennis M. Ritchie发明了C语言. 2007年的 ...
- Python Ethical Hacking - MAC Address & How to Change(3)
SIMPLE ALGORITHM Goal -> Check if MAC address was changed. Steps: 1. Execute and read ifconfig. ...
- xss利用
xss盗取cookie 什么是cookie cookie是曲奇饼,啊开个玩笑,cookie是每个用户登录唯一id和账号密码一样可以登录到网站,是的你没有听错cookie可以直接登录,至于服务器怎么设置 ...
- 题解 洛谷 P4695 【[PA2017]Banany】
考虑用动态点分治来解决像本题这样带修的树上路径问题. 首先对原树进行点分治,建出点分树,在点分树每个节点上用动态开点线段树来维护以该节点为起点,到其点分树子树中每个节点的利润. 查询时只需在点分树上当 ...
- I 2 C、 SPI、 USB驱动架构
根据图12.4, Linux倾向于将主机端的驱动与外设端的驱动分离, 而通过一个核心层将某种总线的协议进行抽象, 外设端的驱动调用核心层API间接过渡到对主机驱动传输函数的调用. 对于I 2 C. S ...
- three.js 对象绕任意轴旋转--模拟门转动
说了几篇的数学方法,这篇放松一下,郭先生说说绕任意轴转动.说一说其中一种方法,也是比较容易理解的一种,它的原理就是将子对象放到一个盒子中,然后改变子对象相对于父对象的位置(因为子对象的原点默认还是在盒 ...
- 前端学习(六):body标签(四)
进击のpython ***** 前端学习--body标签 关于前面的都是大部分的标签内容 但是就像衣服一样,除了要有,还要放到适当的位置 我们先来看看一下网页的布局: 就可以看出来,网页都是一块一块的 ...
- pandas之Seris和DataFrame
pandas是一个强大的python工具包,提供了大量处理数据的函数和方法,用于处理数据和分析数据. 使用pandas之前需要先安装pandas包,并通过import pandas as pd导入. ...
- python数据处理书pdf版本|内附网盘链接直接提取|
Python数据处理采用基于项目的方法,介绍用Python完成数据获取.数据清洗.数据探索.数据呈现.数据规模化和自动化的过程.主要内容包括:Python基础知识,如何从CSV.Excel.XML.J ...
- Python for循环使用 else 语句
Python for循环使用 else 语句: else:当 for 所有的语句代码块正常运行完,才会运行 else 语句. 示例: ''' for 迭代对象 in 序列: 代码块(一行语句或多行代码 ...