Java异常


2019-07-06  22:16:29  by冲冲

1. 引例

任何程序都有出错的可能。比如代码少一个分号,那么运行的结果是 java.lang.Error。比如运行 System.out.println(11/0),那么程序会抛出java.lang.ArithmeticException 的异常。

Java异常是一个对象。异常既代表一种错误,也代表一个消息,一个需要操作者回应如何解决问题的信息。

2. 异常的类型

(1)Throwable 类是 Error 类和 Throwable 类的父类。

Error类:Error类发生在运行时。Java 程序通常不捕获错误,它们在Java程序处理的范畴之外。例如,JVM 内存溢出。程序不会从错误中恢复,程序会终止

Exception类:所有的异常类都是继承 java.lang.Exception 类的子类。异常类有两个主要的子类:IOException 类和 RuntimeException 类。程序本身可以捕获异常,并且处理异常

异常和错误的区别:异常是可以被处理的,而错误是没法处理的。

(2)异常的类型

① 检查性异常: 不处理,则编译不能通过。

② 非检查性异常: 不处理,但是编译可以通过,如果有抛出直接抛到控制台。

③ 运行时异常: 就是非检查性异常。

④ 非运行时异常: 就是检查性异常。

3. 异常的处理

Java 的异常处理通过 5 个关键字来实现:try、catch、throw、throws 和 finally。

try catch 语句用于捕获并处理异常,finally 语句用于在任何情况下(除特殊情况外)都必须执行的代码,throw 语句用于拋出异常,throws 语句用于声明可能会出现的异常。

(1)try-catch

 1 try {
2
3 //可能产生异常的代码区,也称为监控区
4
5 } catch(ExceptionType1 e) {
6
7 //捕获并处理try抛出异常类型为ExceptionType1的异常
8
9 } catch(ExceptionType2 e) {
10
11 //捕获并处理try抛出异常类型为ExceptionType2的异常
12
13 }

执行流程:

① try块(监控区)一旦发生异常,则会根据当前运行时的信息创建异常对象,并将该异常对象抛出监控区。

② 系统根据该异常对象依次匹配catch子句,若匹配成功(抛出的异常对象的类型和catch子句的异常类的类型或者是该异常类的子类的类型一致),则运行其中catch代码块中的异常处理代码,一旦处理结束,那就意味着整个try-catch结束。

③ 含有多个catch子句,一旦其中一个catch子句与抛出的异常对象类型一致时,其他catch子句将不再有匹配异常对象的机会。

 1 import java.io.*;
2 public class ExcepTest{
3 public static void main(String args[]){
4 try{
5 int a[] = new int[2];
6 System.out.println("Access element three :" + a[3]);
7 }catch(ArrayIndexOutOfBoundsException e){
8 System.out.println("Exception thrown :" + e);
9 }
10 System.out.println("try-catch块后面的代码...");
11 }
12 }

输出结果:

Exception thrown  :java.lang.ArrayIndexOutOfBoundsException: 3
try-catch块后面的代码...

多重try-catch

 1 try {
2 file = new FileInputStream(fileName);
3 x = (byte) file.read();
4 } catch(FileNotFoundException f) { // Not valid!
5 f.printStackTrace();
6 return -1;
7 } catch(IOException i) {
8 i.printStackTrace();
9 return -1;
10 }

(2)try-catch-finally

 1 try {
2
3 //可能产生的异常的代码区
4
5 }catch (ExceptionType1 e) {
6
7 //捕获并处理try抛出异常类型为ExceptionType1的异常
8
9 }catch (ExceptionType2 e){
10
11 //捕获并处理try抛出异常类型为ExceptionType2的异常
12
13 }finally{
14
15 //无论是否出现异常,finally块中的代码都将被执行
16
17 }

执行流程:

① try没有产生异常时,try代码块中的语句依次被执行。try块执行完毕,跳过catch。如果存在finally,则执行finally代码块,否则执行后续代码。

② try产生到异常时,如果没有与之匹配的catch子句,则该异常交给JVM处理。如果存在finally,则其中的代码仍然被执行,但是finally之后的代码不会被执行

③ try产生到异常时,如果存在与之匹配的catch,则跳到该catch代码块执行处理。如果存在finally,则执行finally代码块,执行完finally代码块之后继续执行后续代码;否则直接执行后续代码。

④ try产生异常,则try块剩余代码不执行。

注意:

① catch 不能独立于 try 存在。

② 在 try/catch 后面添加 finally 块并非强制性要求的。

③ try 代码后不能既没 catch 块也没 finally 块。

④ try, catch, finally 块之间不能添加任何代码。

(3)finally

finally代码块:无论是否捕获异常,finally代码总会被执行。如果try代码块或者catch代码块中有return语句时,finally代码块将在方法返回前被执行。

finally代码块不会被执行的三种情况:

① 在前边的代码中使用System.exit()退出应用。

② 程序所在的线程死亡或者CPU关闭。

③ 如果在finally代码块中的操作又产生异常,则该finally代码块不能完全执行结束,同时该异常会覆盖前边抛出的异常。

(4)抛出异常

方法中用try-catch/try-catch-finally语句捕获并处理异常。但是对于没能力处理的异常,需要通过throws/throw抛出,交给上层的调用方法处理。

① throws 关键字放在方法签名的尾部。一个方法可以声明抛出多个异常,多个异常之间用逗号隔开。

1 public class ExceptionTest
2 {
3 public void someMethed() throws RemoteException, InsufficientFundsException
4 {
5 // Method implementation
6 }
7 ...
8 }

② throw

throw应用再方法内,抛出一个Throwable类型的异常。一旦遇到throw语句,后面的代码都不被执行。如果有finally则执行完再抛出。

throw只能抛出Throwable类和其子类的对象。

public void someMethod() throws RemoteException
{
// Method implementation
throw new RemoteException();
}
//...
}
1 try{
2
3 //可能会发生异常的代码
4
5 }catch(Exception e){
6
7 throw e;
8
9 }

参考:

https://www.runoob.com/java/java-exceptions.html

https://blog.csdn.net/michaelgo/article/details/82790253

https://blog.csdn.net/zhanaolu4821/article/details/81012382

try{file = newFileInputStream(fileName); x = (byte)file.read(); }catch(FileNotFoundExceptionf){// Not valid!f.printStackTrace(); return -1; }catch(IOExceptioni){i.printStackTrace(); return -1; }

【JavaSE】异常的更多相关文章

  1. JavaSE 异常抛光解析

    异常 异常指的是程序中的不正常现象,一般异常都是由第三方数据的使用造成的.java中每种异常现象都会有一个对应的异常类.java对异常的处理方式就是终止程序.异常机制其实是为了帮助我们找到程序中的问题 ...

  2. [javaSE] 异常捕获

    异常:程序在运行时出现的不正常现象 Throwable |——Error |——Exception 严重级别:Error类和Exception类 异常的处理:try{}catch{}finally{} ...

  3. java新手笔记23 异常

    1.import package com.yfs.javase; import java.util.Scanner; //import java.lang.String;//默认导入 public c ...

  4. Java基础10:全面解读Java异常

    更多内容请关注微信公众号[Java技术江湖] 这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux ...

  5. 夯实Java基础系列10:深入理解Java中的异常体系

    目录 为什么要使用异常 异常基本定义 异常体系 初识异常 异常和错误 异常的处理方式 "不负责任"的throws 纠结的finally throw : JRE也使用的关键字 异常调 ...

  6. JavaSE学习笔记(6)---异常

    JavaSE学习笔记(6)---异常 ​ 软件程序在运行过程中,非常可能遇到问题,我们称之为异常,英文是:Exception,意思是例外.遇到这些例外情况,或者叫异常,我们怎么让写的程序做出合理的处理 ...

  7. [007] - JavaSE面试题(七):异常

    第一期:Java面试 - 100题,梳理各大网站优秀面试题.大家可以跟着我一起来刷刷Java理论知识 [007] - JavaSE面试题(七):异常 第1问:Error和Exception的区别? E ...

  8. javase基础笔记4——异常/单例和类集框架

    继承 extends final关键 多态 是在继承的基础上 接口 interface 异常 exception 包的访问可控制权限 private default protect public 异常 ...

  9. JavaSE复习_7 异常

    △子父类涉及的异常问题:      1.子类在覆盖方法时,父类的方法如果抛出了异常,那么子类的方法只能抛出父类的异常或者该异常的子类,且只能抛出异常的子集      2.如果父类抛出了多个异常,子类只 ...

  10. 《Java从入门到放弃》JavaSE入门篇:异常

    异常!!!看看生活中的异常例子: 正常情况下,从家到公司上班,只需要20分钟!但如果在路上碰到堵车或修路或车突然自燃等问题,那就没办法正常去上班了.其中堵车或修路或车突然自燃等问题就属于异常. 碰到异 ...

随机推荐

  1. 【NOIP1998】 三连击 题解

    文章转载前需和原作者联系,否则追究法律责任 题目链接:https://www.luogu.com.cn/problem/P1008 首先我们来分析一下题目.要求是枚举三个数,比例为1:2:3,且各个数 ...

  2. 洛谷4234最小差值生成树 (LCT维护生成树)

    这也是一道LCT维护生成树的题. 那么我们还是按照套路,先对边进行排序,然后顺次加入. 不过和别的题有所不同的是: 在本题中,我们需要保证LCT中正好有\(n-1\)条边的时候,才能更新\(ans\) ...

  3. 禅道开源版 Ldap认证插件开发

    禅道开源版-Ldap插件开发 背景 由于开源版无法使用ldap认证,所以在此分享一下自己开发禅道的ldap开发过程,希望对你有所帮助. 简单说一下这个插件的功能: 1.跳过原有禅道认证,使用ldap认 ...

  4. dubbo注册中心占位符无法解析问题(二)

    dubbo注册中心占位符无法解析问题 前面分析了dubbo注册中心占位符无法解析的问题. 并给出了2种解决办法: 降低mybatis-spring的版本至2.0.1及以下 自定义MapperScann ...

  5. 使用寄存器点亮LED——2

    1. 项目:使用stm32寄存器点亮LED, 分别点亮红.绿.蓝3个灯. 2. 步骤 先新建个文件夹保存项目 再新建项目 将startup_stm32f10x_hd.s拷贝到该文件夹下 新建main. ...

  6. Python代码阅读(第21篇):将变量名称转换为蛇式命名风格

    Python 代码阅读合集介绍:为什么不推荐Python初学者直接看项目源码 本篇阅读的代码实现将变量名称转换为蛇式命名风格(snake case)的功能. 本篇阅读的代码片段来自于30-second ...

  7. Noip模拟15 2021.7.14

    T1 夜莺与玫瑰 题目越发的变态起来... 这题刚开始看超级像仪仗队,好不容易码完欧拉函数后尝试×2后输出但不对!! 于是选择了跳过.... 正解居然是莫比乌斯函数....我也是醉了 预处理完就剩下$ ...

  8. HDI PCB一阶和二阶和三阶如何区分??

      一阶板,一次压合即成,可以想像成最普通的板二阶板,两次压合,以盲埋孔的八层板为例,先做2-7层的板,压好,这时候2-7的通孔埋孔已经做好了,再加1层和8层压上去,打1-8的通孔,做成整板.三阶板就 ...

  9. 大神教零基础入门如何快速高效的学习c语言开发

    零基础如果更快更好的入门C语言,如何在枯燥的学习中找到属于自己的兴趣,如果把学习当成一种事务性的那以后的学习将会很难有更深入的进步,如果带着乐趣来完成学习那将越学越有意思这样才会让你有想要更深入学习的 ...

  10. Python课程笔记(六)

    今天上课补上了上次未学完比较重点的鼠标和键盘事件,同时开始学习运用turtle进行绘图. 本次课程的代码: https://gitee.com/wang_ming_er/python_course_l ...