Java 异常处理

 

目录

异常发生原因

异常类型

Exception 类的层次

Java 内置异常类 

非检查性异常

检查性异常类

异常方法

捕获异常

多重捕获块

throws/throw 关键字:

finally关键字

声明自定义异常

通用异常


      异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。异常错误引起,可能是由于用户、程序或物理错误。 

异常发生原因

       1)用户输入了非法数据。

       2)要打开的文件不存在。

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

异常类型

       1)检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如:打开一个不存在文件。

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

       3)错误: 错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时。

Exception 类的层次

       异常类都是从 java.lang.Exception 类继承的子类。Exception 类是 Throwable 类的子类。

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

      Throwable还有一个子类Error ,Error 用来指示运行时环境发生的错误。

Java 内置异常类 

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

非检查性异常

异常描述
ArithmeticException当出现异常的运算条件时,抛出此异常。例如,一个整数"除以零"时,抛出此类的一个实例。
ArrayIndexOutOfBoundsException用非法索引访问数组时抛出的异常。如果索引为负或大于等于数组大小,则该索引为非法索引。
ArrayStoreException试图将错误类型的对象存储到一个对象数组时抛出的异常。
ClassCastException当试图将对象强制转换为不是实例的子类时,抛出该异常。
IllegalArgumentException抛出的异常表明向方法传递了一个不合法或不正确的参数。
IllegalMonitorStateException抛出的异常表明某一线程已经试图等待对象的监视器,或者试图通知其他正在等待对象的监视器而本身没有指定监视器的线程。
IllegalStateException在非法或不适当的时间调用方法时产生的信号。换句话说,即 Java 环境或 Java 应用程序没有处于请求操作所要求的适当状态下。
IllegalThreadStateException线程没有处于请求操作所要求的适当状态时抛出的异常。
IndexOutOfBoundsException指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出。
NegativeArraySizeException如果应用程序试图创建大小为负的数组,则抛出该异常。
NullPointerException当应用程序试图在需要对象的地方使用 null 时,抛出该异常
NumberFormatException当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。
SecurityException由安全管理器抛出的异常,指示存在安全侵犯。
StringIndexOutOfBoundsException此异常由 String 方法抛出,指示索引或者为负,或者超出字符串的大小。
UnsupportedOperationException当不支持请求的操作时,抛出该异常。

检查性异常类

异常描述
ClassNotFoundException应用程序试图加载类时,找不到相应的类,抛出该异常。
CloneNotSupportedException当调用 Object 类中的 clone 方法克隆对象,但该对象的类无法实现 Cloneable 接口时,抛出该异常。
IllegalAccessException拒绝访问一个类的时候,抛出该异常。
InstantiationException当试图使用 Class 类中的 newInstance 方法创建一个类的实例,而指定的类对象因为是一个接口或是一个抽象类而无法实例化时,抛出该异常。
InterruptedException一个线程被另一个线程中断,抛出该异常。
NoSuchFieldException请求的变量不存在
NoSuchMethodException请求的方法不存在

异常方法

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

序号方法及说明
1public String getMessage()
返回关于发生的异常的详细信息。这个消息在Throwable 类的构造函数中初始化了。
2public Throwable getCause()
返回一个Throwable 对象代表异常原因。
3public String toString()
使用getMessage()的结果返回类的串级名字。
4public void printStackTrace()
打印toString()结果和栈层次到System.err,即错误输出流。
5public StackTraceElement [] getStackTrace()
返回一个包含堆栈层次的数组。下标为0的元素代表栈顶,最后一个元素代表方法调用堆栈的栈底。
6public Throwable fillInStackTrace()
用当前的调用栈层次填充Throwable 对象栈层次,添加到栈层次任何先前信息中。

捕获异常

       使用 try 和 catch 关键字可以捕获异常。try/catch 代码块放在异常可能发生的地方。

       try/catch代码块中的代码称为保护代码,使用 try/catch 的语法结构如下:

try
{
   // 程序代码
}catch(ExceptionName e1)
{
   //Catch 块
}

       Catch 语句包含要捕获异常类型的声明。当保护代码块中发生一个异常时,try 后面的 catch 块就会被检查。如果发生的异常包含在 catch 块中,异常会被传递到该 catch 块,这和传递一个参数到方法是一样。

多重捕获块

       一个 try 代码块后面跟随多个 catch 代码块的情况就叫多重捕获。

多重捕获块的语法结构如下:

try{
 // 程序代码
 }catch(异常类型1 异常的变量名1){ 
// 程序代码 
}catch(异常类型2 异常的变量名2){
 // 程序代码 
}catch(异常类型3 异常的变量名3){
 // 程序代码 
}

throws/throw 关键字:

       如果一个方法没有捕获到一个检查性异常,那么该方法必须使用 throws 关键字来声明。throws 关键字放在方法签名的尾部;也可以使用 throw 关键字抛出一个异常,无论它是新实例化的还是刚捕获到的。一个方法可以声明抛出多个异常,多个异常之间用逗号隔开。

finally关键字

      finally 关键字用来创建在 try 代码块后面执行的代码块。无论是否发生异常,finally 代码块中的代码总会被执行。在 finally 代码块中,可以运行清理类型等收尾善后性质的语句。

finally 代码块出现在 catch 代码块最后,语法结构如下:

try{ 
 // 程序代码 
}catch(异常类型1 异常的变量名1){
 // 程序代码 
}catch(异常类型2 异常的变量名2){
 // 程序代码 
}finally{ 
// 程序代码 
}

声明自定义异常

        编写自定义异常类时,注意以下几点:

1)所有异常都必须是 Throwable 的子类。

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

3)如果你想写一个运行时异常类,那么需要继承 RuntimeException 类。

通用异常

       JVM(Java虚拟机) 异常:由 JVM 抛出的异常或错误。例如:NullPointerException 类,ArrayIndexOutOfBoundsException 类,ClassCastException 类。

       程序级异常:由程序或者API程序抛出的异常。例如 IllegalArgumentException 类,IllegalStateException 类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值