搜索
写经验 领红包
 > 游戏

java异常处理规则(新手必看)(java异常处理基础)

导语:Java基础——异常

1 基本概括

2 主要介绍

2.1 异常的概念

什么是异常

指程序在运行过程中,出现的非正常的情况,最终会导致java虚拟机(jvm)的非正常停止。

异常如何处理

当异常出现时,执行预先准备好的程序

异常处理必要性

减少用户的损失、同时也减少给用户带来的不必要的麻烦;也可以利用异常处理给与用户一些提示

异常机制的概述

异常机制是指当程序出现错误后,程序如何处理。具体来说,异常机制提供了程序退出的安全通道。当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器。

程序错误分为三种:1.编译错误;2.运行时错误;3.逻辑错误。

(1)编译错误是因为程序没有遵循语法规则,编译程序能够自己发现并且提示我们错误的原因和位置,这个也是大家在刚接触编程语言最常遇到的问题。

(2)运行时错误是因为程序在执行时,运行环境发现了不能执行的操作。

(3)逻辑错误是因为程序没有按照预期的逻辑顺序执行。异常也就是指程序运行时发生错误,而异常处理就是对这些错误进行处理和控制。

2.2 异常产生的原因

自动产生异常

产生原因

程序运行过程中,遇到错误的代码,自动产生异常

结果

程序中一旦出现异常,程序不能继续执行之后的代码,则程序被终止掉

手动产生异常

关键字

throw

语法

修饰符 返回值类型 方法名(形参列表)throws 异常 的类名1,异常类名2{// 方法的实现部分}

位置

定义在方法内部

结果

作用效果类似于 return语句,终止当前方法、函数;程序运行时因异常而被终止掉

2.3 异常的传递

Java中的异常沿着方法的调用链进行反方向进行传递,最终传递给JVM

2.4 异常的处理

2.4.1 消极处理异常(声明异常)

关键字

throws

位置

在方法声明处

语法

修饰符 返回值类型 方法名(形参列表)throws 异常 的类名1,异常类名2{// 方法的实现部分}

消极处理异常时,可以利用其父类型的异常进行处理

结果

消极处理异常只是推卸责任,最终将责任推卸给JVM,程序最终还是因异常而被终止

作用

消极处理异常可以让非运行时异常在编译时通过

2.4.2 积极处理异常

语法

try{   // 可能出现异常的语句}catch(异常类名 e){   // 异常出现执行的语句}

try…catch常用的语法

1 try…catch结构,一旦异常出现try…catch 才起作用

2 try后面可以跟多个 catch结构,一旦try中出现异常,则从 上往下依次进行匹配catch,直到匹配成功

3 catch中可以利用父类型捕获:本类+所有的子类型的异 常,体现多态

4 子类型 的 catch 需要定义在 父类型的 catch前面

5 catch中 智能定义 try中可能出现的非运行时异常; catch中 可以定义任意的运行时异常,即使try中不可能出现 此类运行时异常

2.5 五个关键字

Java异常处理的五个关键字:try、catch、finally、throw、throws

2.5.1 throw关键字作用

可以使用throw关键字在指定的方法中抛出指定的异常

使用格式:

throw new xxxException(&34;);

注意:

1 throw关键字必须写在方法的内部

2 throw关键字后边new的对象必须是Exception或者Exception的子类对象

3 throw关键字抛出指定的异常对象,我们就必须处理这个异常对象

4 throw关键字后边创建的是RuntimeException或者是RuntimeException的子类对象,我们可以不处理,默认交给JVM处理(打印异常对象,中断程序)

5throw关键字后边创建的是编译异常(写代码的时候报错),我们就必须处理这个异常,要么throws,要么try...catch

2.5.2 throws声明异常

throws关键字:异常处理的第一种方式,交给别人处理作用:

1 当方法内部抛出异常对象的时候,那么我们就必须处理这个异常对象

2 可以使用throws关键字处理异常对象,会把异常对象声明抛出给方法的调用者处理(自己不处理,给别人处理),最终交给JVM处理-->中断处理

使用格式:在方法声明时使用

修饰符 返回值类型 方法名(参数列表) throws AAAException ,BBBException...{    throw new AAAException(&34;);    throw new BBBException(&34;);}

注意:

1 throws关键字必须写在方法声明处

2 throws关键字后边声明的异常必须是Exception或者是Exception的子类

3 方法内部如果抛出了多个异常对象,那么throws后边必须也声明多个异常

4 如果抛出的多个异常对象有父子类关系,那么直接声明父类异常即可

5 调用了一个声明抛出异常的方法,我们就必须处理这个异常对象

要么继续使用throws声明抛出,交给方法的调用者处理,最终交给JVM

要么try...catch自己处理异常

2.5.3 捕获异常try...catch

try...catch:异常处理的第二种方式,自己处理异常

格式:

try{    可能产生异常的代码}catch(定义一个异常的变量,用来接收try中抛出的异常对象){    异常的处理逻辑,在异常对象之后,怎么处理异常对象    一般在工作中,会把异常的信息记录到一个日志中}...    catch(异常类名 变量名){    }

注意:

1 try中可能会抛出多个异常对象,那么就可以使用多个catch来处理这些异常对象

2 如果try中产生了异常,那么就会执行catch中的异常处理逻辑,执行完毕catch中的处理逻辑,继续执行try...catch之后的代码

如果try中没有产生异常,那么就不会执行catch中异常的处理逻辑,执行完try中的代码,继续执行try...catch之后的代码Throwable类中定义了3个异常处理的方法

1 String getMessage() 返回 Throwable 的简短描述

2 String toString() 返回 Throwable 的详细消息字符串

3 void printStackTrace() JVM打印异常对象,默认此方法,打印的异常信息是最全面的

2.5.4 finally代码块格式

try{        可能产生异常的代码    }catch(定义一个异常的变量,用来接收try中抛出的异常对象){        异常的处理逻辑,在异常对象之后,怎么处理异常对象        一般在工作中,会把异常的信息记录到一个日志中    }    ...    catch(异常类名 变量名){            }finally{        无论是否出现异常都会执行    }

注意:

1 finally不能单独使用,必须和try一起使用

2 finally一般用于资源释放(资源回收),无论程序是否出现异常,最后都需要资源释放(IO)

3 如果finally有return语句,永远返回finally中的结果,避免该情况。

注意:

1 父类方法没有抛出异常,子类重写父类该方法时也不可抛出异常。此时子类产生该异常,只能捕获处理,不能声明抛出。

2 父类异常时什么样,子类异常就什么样

2.6 异常的分类

Throwable 类是所有异常和错误的超类,下面有 Error 和 Exception 两个子类分别表示错误和异常。其中异常类 Exception 又分为运行时异常和非运行时异常,这两种异常有很大的区别,也称为不检查异常(Unchecked Exception)和检查异常(Checked Exception)。

Exception 类用于用户程序可能出现的异常情况,它也是用来创建自定义异常类型类的类。

Error 定义了在通常环境下不希望被程序捕获的异常。Error 类型的异常用于 Java 运行时由系统显示与运行时系统本身有关的错误。堆栈溢出是这种错误的一例。

本章不讨论关于 Error 类型的异常处理,因为它们通常是灾难性的致命错误,不是程序可以控制的。本章接下来的内容将讨论 Exception 类型的异常处理。

运行时异常都是RuntimeException 类及其子类异常,如 NullPointerException、IndexOutOfBoundsException 等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般由程序逻辑错误引起,程序应该从逻辑角度尽可能避免这类异常的发生。

非运行时异常是指 RuntimeException 以外的异常,类型上都属于 Exception 类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如 IOException、ClassNotFoundException 等以及用户自定义的 Exception 异常,一般情况下不自定义检查异常。表 1 列出了一些常见的异常类型及它们的作用。

throwable类与其此类的结构体系图:

Throwable类中常用方法如下:

1. 返回异常发生时的详细信息public string getMessage();2. 返回异常发生时的简要描述public string toString();3. 返回异常对象的本地化信息。使用Throwable的子类覆盖这个方法,可以声称本地化信息。如果子类没有覆盖该方法,则该方法返回的信息与getMessage()返回的结果相同public string getLocalizedMessage();4. 在控制台上打印Throwable对象封装的异常信息public void printStackTrace();

2.7 Exception

2..7.1 常见的异常介绍

1. RuntimeException子类:

2.IOException

3. 其他

2.8 自定义异常

一个类继承Exception或是其子类,如果定义的类继承了RuntimeException或是RuntimeException的子类,则此异常为运行时异常;如果此类和RuntimeException 没有任何继承关系,则异常类为非运行时异常

提供两个构造方法

a. 无参数的构造方法

b. 有参数的构造方法,参数类型为String ,接收异常信息利用super(message); 设置异常信息

3 问题总结

1 为什么要创建自己的异常?   答:当Java内置的异常都不能明确的说明异常情况的时候,需要创建自己的异常。2应该在声明方法抛出异常还是在方法中捕获异常?  答:捕捉并处理知道如何处理的异常,而抛出不知道如何处理的异常。3 java 中 Error 和 Exception 有什么区别?4 java 中什么是异常链?5 java 中被检查的异常和不受检查的异常有什么区别?6 java 异常有哪几种,特点是什么?7 如果执行 finally 代码块之前方法返回了结果或者 JVM 退出了,这时 finally 块中的代码还会执行吗?8 关于 java 中的异常处理你有啥心得或者经验?9 java 中什么时候使用断言(assert)

预告下一篇如何优雅地处理异常,想了解的朋友可以关注 ,文章有帮助的话可以长按点赞有惊喜!!!文章比较长,大家可以先 收藏、转发后看,有什么补充可以在下面评论,谢谢大家!

本文内容由小姿整理编辑!