记录生活中的点点滴滴

0%

Java的异常基础

异常是Java健壮性的一个重要体现。

在Java中,所有的异常都有一个共同的祖先 Throwable(可抛出)。

Throwable:有两个重要的子类:Exception(异常)和 Error(错误)。

异常与错误的区别是:异常能被程序本身处理,错误是无法处理的。

Error(错误):是程序无法处理的错误,表示运行应用程序中较严重的问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时JVM出现的问题。这些异常发生时,JVM一般会选择线程终止。

Exception(异常):是程序本身可以处理的异常,分两大类:运行时异常和非运行时异常(编译异常)。程序中应当尽可能去处理这些异常。

  • 运行时异常:都是 RuntimeException 类及其子类异常,如ullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等,这些异常一般由程序逻辑错误引起的,应该尽可能避免这些异常的发生。运行时异常的特点是Java编译器不会检查它,也就是说,当程序中出现这类异常,即使没有用 try-catch 语句捕获它,也没有用 throws 抛出它,也能编译通过。

  • 非运行时异常(编译异常):RuntimeException 以外的异常。从程序语法角度讲是必须处理的异常,如果不处理,程序就不能编译通过,如 IOExceptionSQLException 等以及自定义的异常,一般情况下不自定义检查异常。

Throwable的常用方法如下:

1
2
3
4
5
6
7
8
9
10
11
1. 返回异常发生时的详细信息
public string getMessage();

2. 返回异常发生时的简要描述
public string toString();

3. 返回异常对象的本地化信息。使用Throwable的子类覆盖这个方法,可以声称本地化信息。如果子类没有覆盖该方法,则该方法返回的信息与getMessage()返回的结果相同
public string getLocalizedMessage();

4. 在控制台上打印Throwable对象封装的异常信息
public void printStackTrace();

通常,Java的异常(Throwable)可分为可查的异常(checked exceptions)不可查的异常(unchecked exceptions)

1、可查异常(编译器要求必须处置的异常):除了 RuntimeException 及其子类以外,其他的 Exception 类及其子类都属于可查异常。这种异常的特点是Java编译器会检查它,也就是说,当程序中可能出现这类异常,要么用 try-catch 语句捕获它,要么用 throws 子句声明抛出它,否则编译不会通过。

2、不可查异常(编译器不要求强制处置的异常):包括运行时异常(RuntimeException 及其子类)和错误(Error)。

异常的处理:

异常抛出:任何Java代码都可以抛出异常,如:自己编写的代码、来自Java开发环境包中代码,或者Java运行时系统。无论是谁,都可以通过Java的throw语句抛出异常。从方法中抛出的任何异常都必须使用throws子句。

异常捕获:捕捉异常通过try-catch语句或者try-catch-finally语句实现。

总体来说,Java规定:对于可查异常必须捕捉、或者声明抛出。允许忽略不可查的RuntimeException和Error。

throwsthrow 关键字区别,看下面代码:

1
2
3
4
@Test
public void Test1() throws Exception{
throw new Exception("Test1方法中的Exception...");
}

相关的问题
1. 为什么要创建自己的异常?
答:当Java内置的异常都不能明确的说明异常情况的时候,需要创建自己的异常。

2. 应该在声明方法抛出异常还是在方法中捕获异常?
答:捕捉并处理知道如何处理的异常,而抛出不知道如何处理的异常。

对于一个应用系统,设计一套良好的异常处理体系很重要,例如 Spring,这一点,我还没怎么研究过,以后再扯吧,今天就写点这么多基础的东西就好。