在 Java 中声明了很多异常类,每个异常类都表示一种运行错误。程序运行过程中发生一个可识别的运行错误时(可以找到与错误匹配的异常类,例如被除数为 0 时会触发 java.lang.ArithmeticException),系统会抛出对应异常类的对象。

参考:Java 异常处理

Java 异常处理机制的优点

  • 分离错误处理代码,使业务代码更专注
  • 按照类型对错误分组
  • 可以捕获处理无法预测的错误
  • 异常类的对象包含了异常的充分信息
  • 可以按照调用栈传播错误,直到有处理错误的代码

错误分类

根据错误的严重程度不同,可以分为两类:

  • 错误:致命的,无法处理的。最上层父类是 Error 类
  • 异常:非致命,可以捕获并处理。最上层父类是 Exception 类

Throwable 是 Error 和 Exception 的父类。

Java 中有3种方式生成异常对象:

  • 由 Java 虚拟机生成
  • 由 Java 类库中的某些类生成
  • 在自己写的程序中生成和抛出异常对象

必须通过 throw 语句抛异常对象,异常对象必须是 Throwable 或其子类的实例。

throw new XXException();

XXException e = new XXException();
throw e;

Throwable 类的主要方法

方法 描述
public String getMessage() 获取异常的详细信息
public Throwable getCause() 返回 Throwable 对象,代表异常的原因
public void printStackTrace() 打印toString()结果和栈层次到 System.err 错误输出流。
public StackTraceElement [] getStackTrace() 返回一个包含堆栈层次的数组。下标为0的元素代表栈顶,最后一个元素代表方法调用堆栈的栈底。

异常的分类

根据是否必须捕获异常,可以将异常分为两类:

非检查型异常(也叫运行时异常)

非检查型异常继承自 RuntimeException,不需要在程序中进行捕获,编译器也不会检查。之所以可以不捕获,有两个原因:

  • 引发这类异常的操作经常出现(例如使用对象时如果对象为 null 则抛异常)
  • 要抛的异常可以用其他方式解决(例如被除数为0会抛出异常,但可以提前判断被除数来防止这种异常)
public class Excep {
public static void main(String[] args) {
String[] arr = {"hello", "world"};
int i = 0;
while(i < 10) {
System.out.println(arr[i++]);
}
}
}

上面这段代码并没有捕获异常,编译通过,执行时会因为数组下标越界而报错:

[root@VM_139_38_centos java]# java Excep
hello
world
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2
at Excep.main(Excep.java:6)

检查型异常

对于检查型异常,调用者必须捕获并处理(try{...}catch(...){...})或也声明抛出(`throws XXException``)。如果所有方法都没有处理这种异常,最终异常会交给 Java 虚拟机来处理。编译器会检查这种异常。

public class T {
public static void main(String[] args) {
He h = new He();
h.fun();
}
}
class He {
public void fun() throws Exception {
throw new RuntimeException();
}
}

上面这段代码中,类 He 中的 fun 方法会抛出异常,当时调用者并没有捕获也没有继续抛出,所以执行时会报错:

T.java:4: unreported exception java.lang.Exception; must be caught or declared to be thrown
h.fun();
^
1 error

如果异常一路都在抛,没有方法处理,最后到了 main 方法还在抛异常public static void main(String[] args) throws Exception{...},那最后 Java 虚拟机会接收到这个异常,程序会停止执行并报错,例如:

public class T {
public static void main(String[] args) throws Exception{
He h = new He();
h.fun();
System.out.println("end of program");
}
}
class He {
public void fun() throws Exception {
throw new RuntimeException();
}
}
[root@VM_139_38_centos java]# java T
Exception in thread "main" java.lang.RuntimeException
at He.fun(T.java:10)
at T.main(T.java:4)

捕获并处理异常

Java 中用 try{...}catch(...){...}finally{...} 语句捕获异常。其中,try 代码段中是可能抛出异常的代码,catch 代码段在匹配异常时执行,finally 代码段则是无论是否发生异常都会执行的代码段。语法为:

try {
// 程序代码
} catch(ExceptionName1 e1) {
//Catch 块
} catch(ExceptionName2 e2) {
//可以有多个 Catch 块
} finally {
//finally 块
}

例如,对于数组越界异常的捕获处理:

public class ExcepTest{
public static void main(String args[]){
try{
int a[] = new int[2];
System.out.println("Access element three :" + a[3]);
}catch(ArrayIndexOutOfBoundsException e){
System.out.println("Exception thrown :" + e);
}finally{
System.out.println("finally run");
}
System.out.println("Out of the block");
}
}

结果为:

Exception thrown  :java.lang.ArrayIndexOutOfBoundsException: 3
finally run
Out of the block

throws/throw 关键字

对于检查性异常,如果方法不想捕获,那么该方法必须使用 throws 关键字来抛出这个异常(如果有多个可能的异常,需要用逗号分隔),交给调用者来处理。throws 关键字放在方法签名的尾部。

public void fun() throws RemoteException, InsufficientFundsException
{
// Method implementation
}

throw 关键字用于抛出异常给方法的调用者,注意需要在方法签名尾部用 throws 抛出这个异常。

public void fun() throws RemoteException
{
throw new RemoteException();
}

自定义异常

Java 中的异常类跟普通的类一样,有属性和方法。根据自定义的异常是否需要检查,可以分为两类:

  • 检查型异常类,需要继承 Exception 类。
  • 运行时异常类,需要继承 RuntimeException 类。

语法示例:

class MyException extends Exception{
}

代码示例:

public class T {
public static void main(String[] args) {
try {
throw new MyException(666);
} catch (MyException e) {
System.out.println(e);
}
}
}
class MyException extends Exception {
private int amount;
public MyException(int amount) {
this.amount = amount;
}
public String getMessage() {
return "amount not enough" + this.amount;
}
}

运行结果:

MyException: amount not enough666

Java 基础-异常处理的更多相关文章

  1. Java基础—异常处理总结

      异常处理是程序设计中一个非常重要的方面,也是程序设计的一大难点,从C开始,你也许已经知道如何用if...else...来控制异常了,也许是自发的,然而这种控制异常痛苦,同一个异常或者错误如果多个地 ...

  2. 十二、Java基础---------异常处理机制

    异常 异常 异常就是程序在运行时产生的异常情况. 异常的由来 问题也是现实生活中的具体事物,也可以通过java 类的形式进行描述,并封装成对象.异常就是java 对不正常情况进行描述后的对象的体现. ...

  3. Java基础——异常处理

    异常的层次结构 所有的异常类都是 java.lang.Exception 类的子类型.异常类都是 Throwable 类的子类.除了异常类 Error 类也是由 Throwable 类产生的的子类1. ...

  4. Java基础--异常处理

    1.异常的传统处理方式 缺点: [1] 通过判断影响执行效率. [2] 判断逻辑和业务逻辑交织在一起,可维护性很差. public class Test01 { public static void ...

  5. java基础—异常处理

    一.异常的概念 异常指的是运行期出现的错误,也就是当程序开始执行以后执行期出现的错误.出现错误时观察错误的名字和行号最为重要.

  6. Java基础-异常处理机制 及异常处理的五个关键字:try/catch/finally/throw /throws

    笔记: /** 异常处理机制: 抓抛模型 * 1."抛", 一旦抛出,程序终止! printStackTrace()显示异常路径! * 2."抓", 抓住异常 ...

  7. java基础异常处理

    异常的定义:中断了正常指令流的事件. try..catch..finally结构: class Test{ public static void main(String[] args){ System ...

  8. Java基础(四)-异常处理机制及其设计

    本篇主要是记录自己所理解的Java异常处理机制(基于jdk1.7)以及怎么去处理和设计异常.还记得当初学习Java异常这块的时候都没怎么注意它的用途,以为就是简单的处理下异常,我避免程序出现这样错误就 ...

  9. Java基础学习之异常处理(6)

    @ 目录 1.异常是什么 1.1.Error 1.2.Exception 2.异常处理机制 2.1.捕获异常 2.2.抛出异常 3.自定义异常 3.1.自定义检查性异常 3.2.自定义运行时异常 1. ...

随机推荐

  1. 6.css3定位--position

    ⑴Static默认值,没有定位. ⑵Absolute绝对定位.后面的元素会补上原来偏移的位置. ⑶Relative相对定位.后面的元素不会补上原来偏移的位置. ⑷Fixed绝对定位.相对于浏览器窗口固 ...

  2. 原生js格式化json和格式化xml的方法

    在工作中一直看各位前辈的博客解决各种问题,对我的帮助很大,非常感谢! 之前一直比较忙没有写博客,终于过年有了点空闲时间,可以把自己积累的东西分享下,笔记中的部分函数不是自己写的,都是工作中一点点积累的 ...

  3. SSM框架返回json数据

    常见错误:No converter found for return value of type: class .................. 原因分析:这是因为springmvc默认是没有对象 ...

  4. Codeforces Round #430 (Div. 2) - D

    题目链接:http://codeforces.com/contest/842/problem/D 题意:定义Mex为一个序列中最小的未出现的正整数,给定一个长度为n的序列,然后有m个询问,每个询问给定 ...

  5. PAT Advanced 1011 World Cup Betting (20 分)

    With the 2010 FIFA World Cup running, football fans the world over were becoming increasingly excite ...

  6. Linux日常之显示文件总结

    1. 将文件file1.file2的内容都显示出来,并显示行号 cat -n file1 file2 2. 将文件file1.file2中带有字符'h'的行显示出来 cat -n file1 file ...

  7. codeforces 299E Cube Problem

    Cube Problem Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Submit   Stat ...

  8. 关于数据库抛出异常:Incorrect string value: '\xE1\x...' for column '字段名' at row 1 问题的解决方法

    打开sql,进行语句编辑 ENGINE=InnoDB DEFAULT CHARSET=utf8;字符集设置utf-8编码

  9. Redis 启动警告解决

    Redis 启动警告解决[转] [root@centos224]# service redisd start 21985:M 24 Nov 04:07:20.376 * Increased maxim ...

  10. 什么是LMDB闪电记忆映射数据库

    LightningMemory-MappedDatabase(LMDB)是一个软件库,它以键值存储的形式提供高性能的嵌入式事务数据库.LMDB是用C语言编写的,具有多种编程语言的API绑定.LMDB将 ...