Java中的异常(Error与Exception)

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

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

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

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

异常的结构

在 Java 中,所有的异常都有一个共同的祖先 Throwable(可抛出)。Throwable 指定代码中可用异常传播机制通过 Java 应用程序传输的任何问题的共性。

java 程序没报错 编译报错 编译java程序时出现error_java 程序没报错 编译报错

Throwable: 有两个重要的子类:Exception(异常)和 Error(错误),二者都是 Java 异常处理的重要子类,各自都包含大量子类。异常和错误的区别是:异常能被程序本身可以处理,错误是无法处理。

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

Error(错误)

Error 是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。例如,Java虚拟机运行错误(Virtual MachineError),当 JVM 不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。这些错误表示故障发生于虚拟机自身、或者发生在虚拟机试图执行应用时,如Java虚拟机运行错误(VirtualMachineError)、类定义错误(NoClassDefFoundError)等。这些错误是不可查的,因为它们在应用程序的控制和处理能力之外,而且绝大多数是程序运行时不允许出现的状况。对于设计合理的应用程序来说,即使确实发生了错误,本质上也不应该试图去处理它所引起的异常状况。在 Java中,错误通过Error的子类描述。

Exception(异常)

是程序本身可以处理的异常。Exception 类有一个重要的子类 RuntimeException。RuntimeException 类及其子类表示“JVM 常用操作”引发的错误。例如,若试图使用空值对象引用、除数为零或数组越界,则分别引发运行时异常(NullPointerException、ArithmeticException)和 ArrayIndexOutOfBoundException。

运行时异常和非运行时异常

  • Exception(异常)分两大类:运行时异常和非运行时异常(编译异常)。程序中应当尽可能去处理这些异常。
  1. 运行时异常:都是RuntimeException类及其子类异常,如NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。运行时异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过。
  2. 非运行时异常 (编译异常):是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常。

Java 常见异常

  1. RuntimeException子类:

异常名称

异常描述

java.lang.ArrayIndexOutOfBoundsException

数组索引越界异常。当对数组的索引值为负数或大于等于数组大小时抛出。

java.lang.ArithmeticException

算术条件异常。譬如:整数除零等。

java.lang.SecurityException

安全性异常

java.lang.IllegalArgumentException

非法参数异常

java.lang.ArrayStoreException

数组中包含不兼容的值抛出的异常

java.lang.NegativeArraySizeException

数组长度为负异常

java.lang.NullPointerException

空指针异常。当应用试图在要求使用对象的地方使用了null时,抛出该异常。譬如:调用null对象的实例方法、访问null对象的属性、计算null对象的长度、使用throw语句抛出null等等。

  1. IOException

异常名称

异常描述

IOException

操作输入流和输出流时可能出现的异常

EOFException

文件已结束异常

FileNotFoundException

文件未找到异常

  1. 其他

异常名称

异常描述

ClassCastException

类型转换异常类

ArrayStoreException

数组中包含不兼容的值抛出的异常

SQLException

操作数据库异常类

NoSuchFieldException

字段未找到异常

NoSuchMethodException

方法未找到抛出的异常

NumberFormatException

字符串转换为数字抛出的异常

StringIndexOutOfBoundsException

字符串索引超出范围抛出的异常

IllegalAccessException

不允许访问某类异常

InstantiationException

当应用程序试图使用Class类中的newInstance()方法创建

java.lang.ClassNotFoundException

找不到类异常。当应用试图根据字符串形式的类名构造类,而在遍历CLASSPAH之后找不到对应名称的class文件时,抛出该异常。

自定义异常

  • 自定义异常
    当Java内置的异常都不能明确的说明异常情况的时候,需要创建自己的异常。
  • 应该在声明方法抛出异常还是在方法中捕获异常?
    捕捉并处理知道如何处理的异常,而抛出不知道如何处理的异常。

参考资料:

  • java异常总述_自定义异常
  • 详解Java中的异常(Error与Exception)