Java异常处理

程序发生异常的原因有很多,通常包含以下几类:

用户输入非法数据

要打开的文件不存在

网络通信连接中断,或者JVM内存溢出

异常有的是因为用户错误引起的,有的是程序错误引起的,还有一些是物理错误引起的。

要理解Java异常处理是如何工作的,要掌握三种类型的异常:

检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。

运行时异常: 运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。

错误: 错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。

Exception类的层次

所有异常类是从java.lang.Exception类继承的子类。

Exception类是Throwable类的子类。除了Exception类外,Throwable还有一个子类Error。

Java程序通常不捕获错误。错误一般发生在严重故障时,他们在Java程序处理范围之外。

Error用来指示运行时环境发生的错误。

例如,JVM内存溢出。一般地,程序不会从错误中恢复。

异常类有两个主要的子类:IOException类和RuntimeException类。

Java内置异常类

在java.lang标准包中定义了异常类,由于 java.lang 包是默认加载到所有的 Java 程序的,所以大部分从运行时异常类继承而来的异常都可以直接使用。

Java 根据各个类库也定义了一些其他的异常,下面的表中列出了 Java 的非检查性异常。

异常

描述

ArithmeticException

当出现异常的运算条件时,抛出此异常。例如,一个整数"除以零"时,抛出此类的一个实例。

ArrayIndexOutOfBoundsException

用非法索引访问数组时抛出的异常。如果索引为负或大于等于数组大小,则该索引为非法索引。

ArrayStoreException

试图将错误类型的对象存储到一个对象数组时抛出的异常。

ClassCastException

当试图将对象强制转换为不是实例的子类时,抛出该异常。

IllegalArgumentException

抛出的异常表明向方法传递了一个不合法或不正确的参数。

IllegalMonitorStateException

抛出的异常表明某一线程已经试图等待对象的监视器,或者试图通知其他正在等待对象的监视器而本身没有指定监视器的线程。

IllegalStateException

在非法或不适当的时间调用方法时产生的信号。换句话说,即 Java 环境或 Java 应用程序没有处于请求操作所要求的适当状态下。

IllegalThreadStateException

线程没有处于请求操作所要求的适当状态时抛出的异常。

IndexOutOfBoundsException

指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出。

NegativeArraySizeException

如果应用程序试图创建大小为负的数组,则抛出该异常。

NullPointerException

当应用程序试图在需要对象的地方使用 null 时,抛出该异常

NumberFormatException

当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。

SecurityException

由安全管理器抛出的异常,指示存在安全侵犯。

StringIndexOutOfBoundsException

此异常由 String 方法抛出,指示索引或者为负,或者超出字符串的大小。

UnsupportedOperationException

当不支持请求的操作时,抛出该异常。

下面的表中列出了 Java 定义在 java.lang 包中的检查性异常类。

异常

描述

ClassNotFoundException

应用程序试图加载类时,找不到相应的类,抛出该异常。

CloneNotSupportedException

当调用 Object 类中的 clone 方法克隆对象,但该对象的类无法实现 Cloneable 接口时,抛出该异常。

IllegalAccessException

拒绝访问一个类的时候,抛出该异常。

InstantiationException

当试图使用 Class 类中的 newInstance 方法创建一个类的实例,而指定的类对象因为是一个接口或是一个抽象类而无法实例化时,抛出该异常。

InterruptedException

一个线程被另一个线程中断,抛出该异常。

NoSuchFieldException

请求的变量不存在

NoSuchMethodException

请求的方法不存在

异常方法

下面的列表是 Throwable 类的主要方法:

序号

方法及说明

1

public String getMessage() 返回关于发生的异常的详细信息。这个消息在Throwable 类的构造函数中初始化了。

2

public Throwable getCause() 返回一个Throwable 对象代表异常原因。

3

public String toString() 使用getMessage()的结果返回类的串级名字。

4

public void printStackTrace() 打印toString()结果和栈层次到System.err,即错误输出流。

5

public StackTraceElement [] getStackTrace() 返回一个包含堆栈层次的数组。下标为0的元素代表栈顶,最后一个元素代表方法调用堆栈的栈底。

6

public Throwable fillInStackTrace() 用当前的调用栈层次填充Throwable 对象栈层次,添加到栈层次任何先前信息中。

异常捕捉

try{

//程序代码块

} catch (ExceptionName1 e1){

//ExceptionName1异常发生时执行

} catch (ExceptionName2 e2) {

//ExceptionName2异常发生时执行

} catch (Exception e) {

} finally {

//无论有无异常发生最后都要执行

}

throws/throw关键字

某些情况下我们需要手动抛出异常来结束程序。例如,创建一个三角型时,当三条边不符合规定时,抛出异常,使用throw关键字。Throws关键字放在方法签名的尾部,可以抛出多个异常。例:

public void deposit(double amount) throws RemoteException

{

throw new RemoteException();

}

使用throw抛出多个异常

public void withdraw(double amount) throws RemoteException,

InsufficientFundsException

{

}

自定义异常

使用自定义类可以产生自己需要的特定的异常,打印特定的异常信息。

在编写自己的异常类时,需要记住下面几点

所有的异常都是Throwable的子类。

如果希望写一个检查性异常类,则需要继承Exception类。

如果写一个运行时异常类,需要继承RuntimeException类。

自定义异常类与其他类一样,可以定义方法和变量。

例:

现有一异常类,用来检查取款操作是否合法

public class AccountCheck extends Exception{

private int amount;//不方法时所缺的金额

public AccountCheck(int amount) {

this.amount = amount;

}

public int getAmount() {

return amount;

}

}

现有一账户类

public class Account {

private int balance;

public Account(int balance) {

this.balance = balance;

}

public void deposite(int amount) {

balance += amount;

}

//当余额小于要取金额时抛出异常

public void withdraw(int amount) throws AccountCheck {

if (balance >= amount) {

balance -= amount;

} else {

throw new AccountCheck(amount-balance);

}

}

public int getBalance() {

return balance;

}

}

进行测试

public static void main(String[] args) {

Account account = new Account(500);

try {

account.withdraw(600);

} catch (AccountCheck accountCheck) {

System.out.println("缺少金额为"+accountCheck.getAmount());

accountCheck.printStackTrace();

}

}

java异常代码_Java异常(示例代码)相关推荐

  1. java 9999 符号_java 9999(示例代码)

    1. map 1.1. map中的方法 1.2. Map.Entry 对于集合来讲,就是把kye-value的数据保存在了Map.Entry的实例之后,再在Map集合中插入了一个Map.Entry的实 ...

  2. arcgis sample代码之SOE示例代码PageLayout REST Server Object Extension 的源码分析

    0.前言 研究 arcgis object的代码是十分重要的,对于学习arcObject太重要了,因为没有这些代码,学习混乱的arcObject将会更佳的困难. 我的arcgis server 是10 ...

  3. java异常判断_Java异常退出条件的判断示例代码

    无论是功能性代码还是算法性代码,程序都是一系列流程的合集 既然是流程就分为:一般流程和异常流程: 一般流程保证了基本功能: 异常流程则是对程序稳定性的保证,不能因为一些非法输入,项目就挂了: 注意,布 ...

  4. java 是否继续_Java异常被抛出或被捕获之后,代码是否继续执行的问题

    在写程序的时候,我们经常被教导,要对异常的信息进行处理,哪里该抛出异常.但是,更多的时候,我们只是模仿异常的抛出,却不知道为什么要这样抛异常(被catch了?被向上抛了?后面的代码是否执行了?). 接 ...

  5. java实时汇率的接口_eoLinker-API_Shop_汇率查询_API接口_Java调用示例代码

    eoLinker-API Shop 汇率查询 Java调用示例代码 汇率查询 提供汇率转换.单个货币对应的热门货币汇率行情,包括人民币.美元.欧元.英镑等100多种货币的实时汇率查询. 该产品拥有以下 ...

  6. java 二十四节气,eoLinker-API_Shop_二十四节气查询_API接口_Java调用示例代码

    eoLinker-API Shop 二十四节气查询 Java调用示例代码 二十四节气查询 二十四节气的时间.由来.习俗以及养生 该产品拥有以下APIs: 1.查询二十四节气 2.查询节气详情 注意,该 ...

  7. java 异常总结_Java异常的十大问题总结

    本文总结了有关Java异常的十大常见问题. 1.已检查与未检查 简而言之,必须在方法中显式捕获已检查的异常或在方法的throws子句中声明该异常.未检查的异常是由无法解决的问题引起的,例如被零除,空指 ...

  8. java多线程代码_java多线程实例代码详解

    原文:http://blog.csdn.net/paranoidyang/article/details/70184523 作者:Paranoidyang 线程与进程的区别 (1)程序是一段静态的代码 ...

  9. java书号属性,基于Java的ISBN书号查询示例代码-六派数据

    示例代码 本代码示例是基于Java的六派数据接口进行数据请求API服务请求的代码示例,使用前你需要: 以下是完整代码示例: /** * 主函数 * @param args */ public stat ...

最新文章

  1. JS基础语法(05)-隐式数据类型转换
  2. 充分利用系统的组策略 保障共享目录安全
  3. 加白名单_Android保活从入门到放弃:乖乖引导用户加白名单吧
  4. Android 创建,验证和删除桌面快捷方式 (删除快捷方式测试可用)
  5. python爬虫从入门到放弃(六)之 BeautifulSoup库的使用
  6. 7.1图的定义和术语
  7. 深入分析Ribbon源码分析
  8. Leetcode每日一题:31.next-permutation(下一个全排列)
  9. 查看oracle数据库的连接情况
  10. C++组合数(combination)的实现
  11. 苹果mac数据库开发工具:Navicat Premium
  12. 安卓h5 ajax上传图片,移动端通过ajax上传图片(文件)并在前台展示——通过H5的FormData对象...
  13. Linux + ChromiumOS + ....操作系统资源(持续更新...)
  14. chrome插件开发(Demo案例)
  15. 常见笔顺错误的字_有哪些常见笔顺错误?
  16. Stream流的方式遍历map,筛选数据
  17. 【机器学习】机器学习常见符号
  18. not allowed to launch “localhost:81/XXXXX“
  19. ES Module 和 Commonjs | require和import的区别
  20. 0基础学RS(二十七)ACL访问控制列表

热门文章

  1. 十三种技术文档模板_帮助企业制作帮助文档的6大“黑科技”工具!
  2. JavaScript中的事件循环
  3. C Primer Plus note7
  4. Markdown入门指南-指间阁
  5. [原创]group by和compute 的使用
  6. 程序猿的爱情--2011-01-05
  7. 常用的js自定义方法 -- hasClass addClass removeClass getElementsByClass
  8. 7月最新发布10.2.0.4.5 Patch Set Update
  9. Comet杀人游戏开发日志-1(问题记录-于核心功能测试成功转向实际开发阶段)
  10. Udp---模拟实现客户端与服务器通信