Java 基础系列:异常

Java 中的异常(Exception)又称为例外,是一个在程序执行期间发生的事件,它中断正在执行的程序的正常指令流。为了能够及时有效地处理程序中的运行错误,必须使用异常类。

1. 异常类型

Throwable是Java中异常的根类,它有两个子类:

  Exception:是程序本身可以处理的异常。异常处理通常就是针对这种类型异常的处理。它也可以细分为两个方向:

    非检查异常(运行时异常):编译器不要求强制处理的异常,程序员可以不管也可以捕获。

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

    检查异常:编译器要求必须处理的异常,否则通不过变异

      例:IO异常、SQL异常

  Error:是程序无法处理的错误,表示运行应用程序中较严重的问题。常见的有:虚拟机错误、内存溢出、线程死锁。

 1 异常类型
 2 Throwable
 3     错误Error
 4         错误不是异常,程序无法处理的错误,表示运行应用程序中较严重的问题。
 5         常见的有:虚拟机错误、内存溢出(堆栈溢出)、线程死锁。
 6         错误类
 7             VirtualMachineError 虚拟机错误
 8                 OutOfMemoryError 内存溢出错误类
 9                 StackOverflowError 栈溢出错误类
10             LinkageError 链接错误类
11                 NoClassDefFoundError 类定义未找到错误类
12             AWTError 图形用户界面错误类
13     异常Exception
14         是程序本身可以处理的异常。异常处理通常就是针对这种类型异常的处理。
15         检查性异常
16             用户错误或问题引起的异常,这是程序员无法预见的,是必须进行处理的异常,如果不处理,程序就不能编译通过。
17             java内置的非运行时异常
18                 ClassNotFoundException    应用程序试图加载类时,找不到相应的类,抛出该异常。
19                 InterruptedException    一个线程被另一个线程中断,抛出该异常。
20                 IOException    I/O 异常的根类
21                 EOFException    文件结束
22                 FileNotFoundException    找不到文件
23                 SQLException    操作数据库异常
24                 NoSuchFieldException    请求的变量不存在
25                 NoSuchMethodException    请求的方法不存在
26                 CloneNotSupportedException    当调用 Object 类中的 clone 方法克隆对象,但该对象的类无法实现 Cloneable 接口时,抛出该异常。
27                 IllegalAccessException    拒绝访问一个类的时候,抛出该异常。
28                 InstantiationException    当试图使用 Class 类中的 newInstance 方法创建一个类的实例,而指定的类对象因为是一个接口或是一个抽象类而无法实例化时,抛出该异常。
29         运行时异常
30             一般由程序逻辑错误引起,是可能被程序员避免的异常。在编译时被忽略,程序中可以选择捕获处理,也可以不处理。
31             RuntimeException
32                 NullPointerException    当应用程序试图在需要对象的地方使用 null 时,抛出该异常
33                 ArithmeticException    当出现异常的运算条件时,抛出此异常。例如,一个整数"除以零"时,抛出此类的一个实例。
34                 ClassCastException    当试图将对象强制转换为不是实例的子类时,抛出该异常。
35                 NumberFormatException    当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。
36                 IllegalMonitorStateException    抛出的异常表明某一线程已经试图等待对象的监视器,或者试图通知其他正在等待对象的监视器而本身没有指定监视器的线程。
37                 IndexOutOfBoundsException    指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出。
38                 StringIndexOutOfBoundsException    此异常由 String 方法抛出,指示索引或者为负,或者超出字符串的大小。
39                 ArrayIndexOutOfBoundsException    用非法索引访问数组时抛出的异常。如果索引为负或大于等于数组大小,则该索引为非法索引。
40                 IllegalArgumentException    抛出的异常表明向方法传递了一个不合法或不正确的参数。
41                 UnsupportedOperationException    当不支持请求的操作时,抛出该异常。
42                 ArrayStoreException    试图将错误类型的对象存储到一个对象数组时抛出的异常。
43                 IllegalStateException    在非法或不适当的时间调用方法时产生的信号。换句话说,即 Java 环境或 Java 应用程序没有处于请求操作所要求的适当状态下。
44                 IllegalThreadStateException    线程没有处于请求操作所要求的适当状态时抛出的异常。
45                 NegativeArraySizeException    如果应用程序试图创建大小为负的数组,则抛出该异常。
46                 SecurityException    由安全管理器抛出的异常,指示存在安全侵犯。
47         用户自定义的Exception异常
48             所有异常都必须是 Throwable 的子类。
49             如果希望写一个检查性异常类,则需要继承 Exception 类。
50             如果你想写一个运行时异常类,那么需要继承 RuntimeException 类。

2. 异常处理

异常处理方法:

  捕获异常
  声明异常
  抛出异常

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

  try catch 语句用于捕获并处理异常,finally 语句用于在任何情况下(除特殊情况外)都必须执行的代码,

  throw 语句用于拋出异常,

  throws 语句用于声明可能会出现的异常。

  

throws 在方法(类)的声明处声明可能要抛出的异常,通常不用显示地捕获异常,可由系统自动将所有捕获的异常信息抛给上级方法;

    当一个方法产生一个它不处理的异常时,那么就需要在该方法的头部声明这个异常,以便将该异常传递到方法的外部进行处理。
    子类方法拋出的异常不会超过父类定义的范围。子类在覆盖父类带 throws 子句的方法时,子类的方法声明中的 throws 子句不能出现父类对应方法的 throws 子句中没有的异常类型,
     也可以申明未检查的异常,但这不是编译器强制的。如果方法抛出了异常那么调用这个方法的时候就需要将这个异常处理或者继续抛出。

throw 在方法(类)内部手动抛出一个具体的异常类型。需要用户自己捕获相关的异常,而后再对其进行相关包装,最后将包装后的异常信息抛出。

    按照语法你可以抛出任意 Throwable (i.e. Throwable或任何Throwable的衍生类) , throw可以中断程序运行,因此可以用来代替return。

    最常见的例子是用 throw 在一个空方法中需要return的地方抛出 UnSupportedOperationException

 1 异常处理
 2     捕获异常
 3         try 执行可能产生异常的代码
 4         catch 捕获异常
 5         finally
 6             finally 用于和try{}catch(){}finally{}组合进行异常处理。用于释放资源,在IO流操作、数据库操作、保证unlock锁 中会见到。
 7             特点:
 8                 1) 不管有没有出现异常,被finally控制的语句体一定会执行。
 9                     特殊情况
10                         1. 在执行到finally之前jvm退出了(比如System.exit(0))
11                         2. try语句中无限循环;
12                          3. 线程被杀死;
13                 2) 当try和catch中有return时,finally仍然会执行;
14                 3) finally是在retrun后面的表达式运算后执行的,不会影响返回值。
15 (此时并没有真的return,而是先把要return的值保存起来,不管最后中的代码怎么样,返回的值都不会改变,仍然是之前保存的值)
16                 4) finally中间好不要包含返回,否则程序会提前退出,返回值不是try和catch中保存的返回值
17         return
18             1) 当try或者catch中有返回值,但是finaly中也有返回语句时,最终返回的是finally中的返回值。
19             2) 当try或者catch进行了return,但是finally中对返回值进行了修改,返回值在try中被缓存了,后面的更改并不能修改到缓存了的返回值。但是在finally中写return是可以返回成功的。
20         try-with-resource只是JDK实现了一个语法糖,本质上还是try-catch-finally
21     声明异常
22         throws 在方法(类)的声明处声明可能要抛出的异常
23         当一个方法产生一个它不处理的异常时,那么就需要在该方法的头部声明这个异常,以便将该异常传递到方法的外部进行处理。
24         子类在覆盖父类带 throws 子句的方法时,子类的方法声明中的 throws 子句不能出现父类对应方法的 throws 子句中没有的异常类型,
25 子类方法拋出的异常不会超过父类定义的范围。
26     抛出异常
27         throw 在方法(类)内部手动抛出一个具体的异常类型。
28         throw 需要用户自己捕获相关的异常,而后再对其进行相关包装,最后将包装后的异常信息抛出。
29     throws vs throw
30         throws 用来声明一个方法可能抛出的所有异常信息
31 throw 则是指拋出的一个具体的异常类型。
32         方法(类)声明处  通过 throws 声明方法(类)可能拋出的异常信息,
33 方法(类)内部     通过 throw 抛出一个具体的异常信息。
34         throws 通常不用显示地捕获异常,可由系统自动将所有捕获的异常信息抛给上级方法;
35 throw 则需要用户自己捕获相关的异常,而后再对其进行相关包装,最后将包装后的异常信息抛出。

3. 补充

  出现运行时异常后,系统会把异常一直往上层抛,一直遇到处理代码。如果没有处理块,到最上层,如果是多线程就由 Thread.run()抛出 ,如果是单线程就被 main() 抛出 。抛出之后,如果是线程,这个线程也就退出了。如果是主程序抛出的异常,那么这整个程序也就退出了。运行时异常是 Exception 的子类,也有一般异常的特点,是可以被 Catch 块处理的。只不过往往我们不对他处理罢了。也就是说,你如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。

  如果不想终止,则必须扑捉所有的运行时异常,决不让这个处理线程退出。队列里面出现异常数据了,正常的处理应该是把异常数据舍弃,然后记录日志。不应该由于异常数据而影响下面对正常数据的处理。 在这个场景这样处理可能是一个比较好的应用,但并不代表在所有的场景你都应该如此。如果在其它场景,遇到了一些错误,如果退出程序比较好,这时你就可以不太理会运行时异常 ,或者是通过对异常的处理显式的控制程序退出。

参考网址

  1. Java异常处理

原文地址:https://www.cnblogs.com/haimishasha/p/11238838.html

时间: 2024-08-30 12:45:53

Java 基础系列:异常的相关文章

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

目录 为什么要使用异常 异常基本定义 异常体系 初识异常 异常和错误 异常的处理方式 "不负责任"的throws 纠结的finally throw : JRE也使用的关键字 异常调用链 自定义异常 异常的注意事项 当finally遇上return JAVA异常常见面试题 参考文章 微信公众号 Java技术江湖 个人公众号:黄小斜 - Java异常 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.c

《Java 基础系列》初步整理

<Java 基础系列>初步整理大概有 12 篇,主要内容为.: 抽象类和接口内部类修饰符装箱拆箱注解反射泛型异常集合IO字符串其他第一篇我们来聊聊抽象类和接口. "抽象类和接口"听起来是非常普遍的东西,有些朋友会觉得:这个太基础了吧,有啥好说的,你又来糊弄我. 这里写图片描述 事实上我在面试中不仅一次被问到相关的问题: 抽象类和接口之间的区别?什么时候创建抽象类?什么时候创建接口?设计框架时该如何选择?我比较喜欢这样的问题,答案可深可浅,体现了我们对日常工作的思考. 我们什

夯实Java基础系列9:深入理解Class类和Object类

目录 Java中Class类及用法 Class类原理 如何获得一个Class类对象 使用Class类的对象来生成目标类的实例 Object类 类构造器public Object(); registerNatives()方法; Clone()方法实现浅拷贝 getClass()方法 equals()方法 hashCode()方法; toString()方法 wait() notify() notifAll() finalize()方法 CLass类和Object类的关系 参考文章 微信公众号 Ja

夯实Java基础系列13:深入理解Java中的泛型

目录 泛型概述 一个栗子 特性 泛型的使用方式 泛型类 泛型接口 泛型通配符 泛型方法 泛型方法的基本用法 类中的泛型方法 泛型方法与可变参数 静态方法与泛型 泛型方法总结 泛型上下边界 泛型常见面试题 参考文章 微信公众号 Java技术江湖 个人公众号:黄小斜 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下Star.Fork.Watch三连哈,感谢你的

【Java基础】异常的简单分类与处理

Java中所有的异常都继承自Throwable类,Throwable类的已知子类有Error和Exception. Error是指系统出现的错误,这种错误出现的时候,我们的程序无能为力,所以不需要进行处理. Exception则是在程序中出现的异常,我们通常对这些异常进行处理. Exception有很多的子类,有一类比较特殊,那就是RuntimeException.RuntimeException属于非受检异常,也就是编译器不会对这种异常进行检查,这类异常被允许不用捕捉,也就是不用catch.我

夯实Java基础系列4:一文了解final关键字的特性、使用方法,以及实现原理

目录 final使用 final变量 final修饰基本数据类型变量和引用 final类 final关键字的知识点 final关键字的最佳实践 final的用法 关于空白final final内存分配 使用final修饰方法会提高速度和效率吗 使用final修饰变量会让变量的值不能被改变吗: 如何保证数组内部不被修改 final方法的三条规则 final 和 jvm的关系 写 final 域的重排序规则 读 final 域的重排序规则 如果 final 域是引用类型 参考文章 微信公众号 Jav

夯实Java基础系列6:一文搞懂抽象类和接口,从基础到面试题,揭秘其本质区别!

目录 抽象类介绍 为什么要用抽象类 一个抽象类小故事 一个抽象类小游戏 接口介绍 接口与类相似点: 接口与类的区别: 接口特性 抽象类和接口的区别 接口的使用: 接口最佳实践:设计模式中的工厂模式 接口与抽象类的本质区别是什么? 基本语法区别 设计思想区别 如何回答面试题:接口和抽象类的区别? 参考文章 微信公众号 Java技术江湖 个人公众号:黄小斜 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl

夯实Java基础系列7:一文读懂Java 代码块和执行顺序

目录 Java中的构造方法 构造方法简介 构造方法实例 例 1 例 2 Java中的几种构造方法详解 普通构造方法 默认构造方法 重载构造方法 java子类构造方法调用父类构造方法 Java中的代码块简介 Java代码块使用 局部代码块 构造代码块 静态代码块 Java代码块.构造方法(包含继承关系)的执行顺序 参考文章 微信公众号 Java技术江湖 个人公众号:黄小斜 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github

Java基础系列1:深入理解Java数据类型

Java基础系列1:深入理解Java数据类型 当初学习计算机的时候,教科书中对程序的定义是:程序=数据结构+算法,Java基础系列第一篇就聊聊Java中的数据类型. 本篇聊Java数据类型主要包括四个内容: Java基本类型 Java封装类型 自动装箱和拆箱 封装类型缓存机制 Java基本类型 Java基本类型分类.大小及表示范围 Java的基本数据类型总共有8种,包括三类:数值型,字符型,布尔型,其中 数值型: 整数类型:byte.short.int.long 浮点类型:float.doubl

Java基础系列5:深入理解Java异常体系

该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架. 前言: Java的基本理念是“结构不佳的代码不能运行”. “异常”这个词有“我对此感到意外”的意思.问题出现了,你也许不清楚该如何处理,但你的确知道不应该置之不理:你要停下来,看看是不是有别人或在别的地方,能够处理这个问题.只是在当前的环境中还没有足够的信息来解决这个问题,所以就把这个问题提交到一个更高级别的环境中,在