1)异常概念
简单说就是程序里面出现的不正常的情况
2)异常分类
1. Throwable
是所有异常类的父类,只有继承的Throwable 的类才能够抛出,也就是写在catch、throw、throws后面
2. Error
1>通常是指非常严重,无法再修复的错误。这种错误无法捕获,也不应该捕获。
2>常见的Error为new一个数组,但是数组过大,java虚拟机无法实现分配,就会产生OutOfMemoryError
3. RuntimeException
1> 是指在运行时抛出的异常,是由于程序设计问题而造成的异常,不要捕获,这种异常可以暴露程序的问题
2> 常见的运行时异常为NullPointerException、ClassNotFoundException(显然出现这些异常就需要检查程序的正确性了)
4. CheckedException
1> 也就是编译期就会发现的异常,必须捕获并处理。是由于引用的方法中使用了throws抛出异常,并在方法上声明了该方法会抛出异常throws Exception
2> 常见的CheckedException:IoException
3> 实例
private int div(int a, int b) throws Exception
{
if(b<0)
throw new Exception("除数是负数");
else
return a/b;
}
@Test
public void test() {
int result = div(4,-1);
System.out.println(result);
}
因为div方法抛出了CheckedException,但是在div被调用的时候由于没有处理该异常,程序就会报错
3)异常处理
1.处理对象:只处理CheckedException,Error和RuntimeException并不处理
2.异常处理关键字
1>try
其中为可能抛出异常的代码, 如果try中代码没有抛出异常,那么try中代码会全部执行
2>catch
catch可以有多个,用来捕获不同类型的异常
注意:catch捕获的异常的顺序必须是从子类到父类,否则会造成代码不可达错误
try
{
int result = div(4,-1);
System.out.println(result);}
catch(Exception e)
{
e.printStackTrace();
}
catch (ArithmeticException e)
{
e.printStackTrace();
}
如上例子中,就算抛出ArithmeticException,也会被Exception捕获,永远不会到达ArithmeticException
3>finally
不管是否抛出异常,finally中的代码始终都会得到运行 3.处理流程
4)抛出、声明异常
1.throws
1>用在方法上,用来声明该方法会抛出异常
2>只能抛出CheckedException,RuntimeException和Error不能使用throws声明
3>throws说明本方法不处理该异常,让调用本方法的程序自行进行处理
2.throw
1>用在代码中,用来抛出异常
2>使用throw抛出异常的方法,在方法上必须使用throws声明
总结:即throw抛出异常,throws声明抛出异常
5) 自定义异常
@Test
public void test()
{
int result = 0 ;
try {
result = div(6,-2);
} catch (DivByNegativeException e)
{
e.printStackTrace();
}
System.out.println(result);
}
private int div(int a, int b) throws DivByNegativeException
{
if(b<0)
throw new DivByNegativeException("这是自定义异常");
return a/b;
}
class DivByNegativeException extends Exception
{
DivByNegativeException() {
}
DivByNegativeException(String msg)
{
super(msg);
}
}
运行结果:
DivByNegativeException: 这是自定义异常
at TestException.div(TestException.java:24)
at TestException.test(TestException.java:13)
6) 常见异常
1)java.lang包:【*:java.lang.RuntimeException的父类是java.lang.Exception,()里面标识着从什么时候的JDK版本号开始拥有该类】
RuntimeException(1.0):
|—ArithmeticException(1.0):[->RuntimeException]
|:当出现运算条件的异常的时候,就抛出该异常,常见情况:计算除法的时候除数为0,该异常为RuntimeException
|—ArrayStoreException(1.0):[->RuntimeException]
|:试图将错误类型的对象存储到一个对象数组的时候抛出该异常,例如一个String的数组里面添加一个Integer对象的时候就会抛出该错误
|—ClassCastException(1.0):[->RuntimeException]
|:试图将一个对象强制转换成为不是该实例的子类的时候,强制转换类型会抛出该异常
|—EnumConstantNotPresentException(1.5):[->RuntimeException]
|:当应用程序试图通过名称和枚举类型访问那些不包含具有指定名称的常量或者枚举量的时候,抛出该异常
|—IllegalArgumentException(1.0):[->RuntimeException]
|:如果方法传递了一个不合法或者不正确的参数的时候,会抛出该异常
|—IllegalThreadStateException(1.0):[->IllegalArgumentException->RuntimeException]
|:当指示线程没有处于请求操作所要求的适当状态的时候抛出的异常,关联于Thread类中的suspend和resume方法
|—NumberFormatException(1.0):[->IllegalArgumentException->RuntimeException]
|:当应用程序试图将字符串转换成一种数值类型,但是该字符串不能转换为适当格式时,抛出该异常。
|—NegativeArraySizeException(1.0):[->RuntimeException]
|:如果应用程序试图创建大小为负的数组的时候,抛出该异常【*:需要区分于ArrayIndexOutOfBoundsException,一个创建数组的时候为负,一个是数组的索引为负,一个是创建的时候一个是使用的时候】
|—IndexOutOfBoundsException(1.0):[->RuntimeException]
|:指示某个排序索引超出范围的时候抛出,针对数组、字符串和向量排序
|—ArrayIndexOutOfBoundsException(1.0):[->IndexOutOfBoundsException->RuntimeException]
|:当访问数组的索引非法越界的时候,就抛出该异常,如果索引为负或者索引大于数组大小的时候,索引为非法索引,注意数组的最大索引为数组的length-1
|—StringIndexOutOfBoundsException(1.0):[->IndexOutOfBoundsException->RuntimeException]
|:此异常由String方法抛出,指示索引或者为负,或者超出字符串的大小。一般情况在charAt的方法调用的时候,当索引等于或者大于字符串的大小的时候抛出该异常
|—NullPointerException(1.0):[->RuntimeException]
|:当应用程序试图在需要对象的地方使用null时,抛出该异常,该异常为程序开发中的常用异常:
[1]调用null对象的实例方法
[2]访问或修改null对象的字段
[3]将null作为一个数组,获得其长度
[4]将null作为一个数组,访问或修改其时间片
[5]将null作为Throwable值抛出
|—SecurityException(1.0):[->RuntimeException]
|:此异常由安全管理器抛出,指示存在一定的安全侵犯
|—TypeNotPresentException(1.5):[->RuntimeException]
|:当应用程序试图使用表示类型名称的字符串对类型进行访问,但无法找到带有指定名称的类型定义的时候抛出该异常,区别于ClassNotFoundException的是,该异常未经过类型检查,而ClassNotFoundException是经过类型检查的异常
|—UnsupportedOperationException(1.2):[->RuntimeException]
|:如果不支持请求的操作的时候,就抛出该异常
Exception(1.0):
|—InstantiationException(1.0):[->Exception]
|:当应用程序试图使用Class中的newInstance方法创建类的实例的时候,指定的类对象没有办法被实例化,抛出该异常,一般有以下状况:
[1]类对象标识一个抽象类、接口、数组类、基本类型、void
[2]类没有非null的构造方法
|—NoSuchFieldException(1.1):[->Exception]
|:当某个类不存在该名称的字段的时候抛出该异常,一般情况在Java反射中使用的时候会抛出该异常
|—NoSuchMethodException(1.0):[->Exception]
|:在反射过程不能找到某一特定方法的时候,抛出该异常
|—InterruptedException(1.0):[->Exception]
|:如果线程在活动之前或者活动期间处于正在等待、休眠或者占用状态且该线程被中断的时候,抛出该异常。
|—ClassNotFoundException(1.0):[->Exception]
|:当JVM试图加载累的时候,抛出该异常,一般情况为调用以下方法:
[1]Class类中的forName方法
[2]ClassLoader类中的findSystemClass方法
[3]ClassLoader类中的loadClass方法
|—CloneNotSupportedException(1.0):[->Exception]
|:当调用Object类中的clone方法的时候,前边已经讲过了对象拷贝,当调用该方法的对象无法实现Cloneable接口的时候,抛出该异常,而且在方法重写的时候可能会抛出该异常
|—IllegalAccessException(1.0):[->Exception]
|:当应用程序在使用反射的时候创建一个实例、设置或者获取一个字段、调用一个方法的时候,正在执行的方法无法访问指定的类、方法、字段或构造方法的时候抛出该异常
【*:在书写继承树的时候,如果该类不属于该介绍包里面的内容这里使用全称】
2)java.net包:
Exception(1.0):
|—URISyntaxException(1.4):[->Exception]
|:抛出经过检查的指示字符串不能解析为URI引用的异常
|—java.io.IOException(1.0):[->Exception]【后边会介绍】
|—SocketTimeoutException(1.4):[->java.io.InterruptedIOException->java.io.IOException->Exception]
|:如果在读取或者接受套子节的时候发生超时,则抛出此异常
|—UnknownServiceException(1.0):[->java.io.IOException->Exception]
|:抛出这一异常指示出现了未知的服务异常,可能是URL连接返回的MIME类型无意义,或者应用程序试图进行对只读的URL连接写入。
|—UnknownHostException(1.0):[->java.io.IOException->Exception]
|—指示主机IP地址无法确定而抛出的异常
|—ProtocolException(1.0):[->java.io.IOException->Exception]
|:抛出此异常指示在底层协议中存在错误,如TCP错误。
|—HttpRetryException(1.5):[->java.io.IOException->Exception]
|:抛出此异常指示HTTP请求需要重试,但由于启用了流模式不能自动重拨,重点是进行HTTP请求的重试操作
|—MalformedURLException(1.0):[->java.io.IOException->Exception]
|:抛出这一串异常指示出现了错误的URL地址,或者说在进行网络访问的时候在字符串里面找不到任何合法协议,或者无法解析传入的字符串,URI不合法等
|—SocketException(1.0):[->java.io.IOException->Exception]
|:抛出此异常指示在底层协议中存在错误,如TCP错误。
|—NoRouteToHostException(1.1):[->SocketException->java.io.IOException->Exception]
|:试图将套接字连接到远程地址和端口时发生错误的情况下,抛出此异常。通常为无法到达远程主机,原因是防火墙干扰或者中间路由器停机。
|—PortUnreachableException(1.4):[->SocketException->java.io.IOException->Exception]
|:在连接的数据报上已接收到 ICMP Port Unreachable消息时,抛出该异常。
|—BindException(1.1):[->SocketException->java.io.IOException->Exception]
|:试图将套字节绑定到本地地址和端口的时发生错误的情况下,抛出该异常,这些错误通常发生在端口正在使用中或者无法分配所请求的本地地址的时候抛出
|—ConnectException(1.1):[->SocketException->java.io.IOException->Exception]
|:试图将套字节连接到远程地址和端口时发生错误的情况下,抛出该异常,这些错误通常发生情况为拒绝远程连接的时候,例如远程地址/端口上没有进行侦听操作
3)java.io包:
Exception(1.0):
|—IOException(1.0):[->Exception]
|:当发生某种I/O异常的时候,抛出该异常,此类是失败或中断的I/O操作生成的异常通用类
|—CharConversionException(1.1):[->IOException->Exception]
|:当字符进行转换的时候发生的异常的基类
|—EOFException(1.0):[->IOException->Exception]
|:当输入过程中意外到达文件或流的末尾时,抛出此异常,此异常主要用于被数据输入流用来表明到达了流的末尾。有时候很多输入操作是返回了某个特殊值而不是抛出该异常
|—FileNotFoundException(1.0):[->IOException->Exception]
|:在不存在具有指定路径名的文件时,此异常将由FileInputStream、FileOutputStream和RandomAccessFile构造方法抛出。如果该文件存在,但是由于某些原因不可访问,比如试图打开一个只读文件进行写入,则此时这些构造方法仍然会抛出该异常。
|—InterruptedIOException(1.0):[->IOException->Exception]
|:I/O 操作已中断信号,抛出此异常。抛出 InterruptedIOException 指示输入或输出传输已经终止,原因是执行此操作的线程中断。字段bytesTransferred指示在发生中断之前已成功传输了多少字节。
|—ObjectStreamException(1.1):[->IOException->Exception]
|:特定于ObjectStream类的所有异常的超类。
|—InvalidClassException(1.1):[->ObjectStreamException->IOException->Exception]
|:当Serialization运行时检测到某个类具有以下几个问题的时候,抛出该异常
[1]该类的序列版本号与从流中读取的类描述符的版本号不匹配
[2]该类包含未知数据类型
[3]该类没有可访问的无参数构造方法
|—InvalidObjectException(1.1):[->ObjectStreamException->IOException->Exception]
|:指示一个或多个反序列化对象未通过验证测试,该参数应该提供失败的原因
|—NotActiveException(1.1):[->ObjectStreamException->IOException->Exception]
|:当序列化和反序列化不活动的时,抛出该异常
|—NotSerializableException(1.1):[->ObjectStreamException->IOException->Exception]
|:当实例需要具有序列化接口时,抛出此异常。序列化运行时或实例的类会抛出此异常。参数应该为类的名称。
|—OptionalDataException(1.1):[->ObjectStreamException->IOException->Exception]
|:指示对象读取操作失败的异常,原因是无法读取流中的基本数据或已序列化对象的数据末尾。以下两种情况都可能抛出此异常:
[1]流中下一个元素是基本数据时试图读取对象。在这种情况下,OptionalDataException的length字段设置成了可从流中直接读取的基本数据的字节数,而eof字段设置成了false。
[2]试图使用类定义的 readObject 或 readExternal 方法读取数据末尾的后面。在这种情况下,OptionalDataException 的eof字段设置成了true,而length字段设置成了0。
|—StreamCorruptedException(1.1):[->ObjectStreamException->IOException->Exception]
|:当从对象流中读取的控制信息与内部一致性检查相冲突时,抛出此异常。
|—WriteAbortedException(1.1):[->ObjectStreamException->IOException->Exception]
|:在写入操作过程中抛出ObjectStreamExceptions之一时,在读取操作过程中将抛出此异常。终止写入的异常可在详细信息字段中找到。该流被重置为初始状态,而且对已经反序列化的对象的所有引用都被丢弃。
|—SyncFailedException(1.1):[->IOException->Exception]
|:当sync操作失败时,抛出该异常
|—UnsupportedEncodingException(1.1):[->IOException->Exception]
|:当使用的字符编码不支持的时候会抛该异常,一般在进行字符串编码的时候会出现该异常
|—UTFDataFormatException(1.0):[->IOException->Exception]
|:在数据输入流中或由实现该数据输入接口的任何类中以UTF-8修改版格式读取错误字符串时,抛出此异常。有关读取和写入UTF-8修改版字符串的格式。
4)java.text包:
Exception(1.0)
|—ParseException(1.0):[-Exception]
|:解析的时候出现以外错误的时候就会抛出该异常,而且该包里面只有这个异常
5)java.util包:
RuntimeException(1.0):
|—ConcurrentModificationException(1.2):[->RuntimeException]
|:当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。需要注意的是:
[1]此异常不会始终指出对象已经由不同线程并发修改。如果单线程发出违反对象协定的方法调用序列,则该对象可能抛出此异常。
[2]迭代器的快速失败行为无法得到保证,因为一般来说,不可能对是否出现不同步并发修改做出任何硬性保证。快速失败操作会尽最大努力抛出ConcurrentModificationException。因此,为提高此类操作的正确性而编写一个依赖于此异常的程序是错误的做法。
[3]某个线程在 Collection 上进行迭代时,通常不允许另一个线性修改该Collection。通常在这些情况下,迭代的结果是不确定的。如果检测到这种行为,一些迭代器实现(包括 JRE 提供的所有通用 collection 实现)可能选择抛出此异常。执行该操作的迭代器称为快速失败迭代器,因为迭代器很快就完全失败,而不会冒着在将来某个时间任意发生不确定行为的风险。
|—EmptyStackException(1.0):[->RuntimeException]
|:该异常由Stack类中的方法抛出,以表明堆栈为空
|—java.lang.IllegalArgumentException(1.5):[->RuntimeException]【前边已经讲过该类了】
|—IllegalFormatException(1.5):[->IllegalArgumentException->RuntimeException]
|:当格式字符串包含非法语法,或者包含与给定参数不兼容的格式说明符时,将抛出未经检查的异常。只应当实例化此异常对应于具体错误的显式子类型。
|—DuplicateFormatFlagsException(1.5):[->IllegalFormatException->IllegalArgumentException->RuntimeException]
|:格式说明符中提供重复标志时抛出的未经检查的异常。
|—FormatFlagsConversionMismatchException(1.5):[->IllegalFormatException->IllegalArgumentException->RuntimeException]
|:转换与标志不兼容时抛出未经检查的异常。
|—IllegalFormatCodePointException(1.5):[->IllegalFormatException->IllegalArgumentException->RuntimeException]
|:将具有Character.isValidCodePoint(int)所定义的无效Unicode代码点的字符传递给Formatter时,抛出未经检查的异常。
|—IllegalFormatConversionException(1.5):[->IllegalFormatException->IllegalArgumentException->RuntimeException]
|:当对应于格式说明符的参数为不兼容的类型时,抛出未经检查的异常。
|—IllegalFormatFlagsException(1.5):[->IllegalFormatException->IllegalArgumentException->RuntimeException]
|:当给出非法组合标志时,抛出未经检查的异常。
|—IllegalFormatPrecisionException(1.5):[->IllegalFormatException->IllegalArgumentException->RuntimeException]
|:当精度为除-1以外的负值、转换类型不支持某个精度或者值在其他方面不受支持时,将抛出未经检查的异常。
|—IllegalFormatWidthException(1.5):[->IllegalFormatException->IllegalArgumentException->RuntimeException]
|:当格式宽度为除-1以外的负值或其他不受支持的值时,将抛出未经检查的异常。
|—MissingFormatArgumentException(1.5):[->IllegalFormatException->IllegalArgumentException->RuntimeException]
|:如果格式说明符没有相应的参数,或者参数索引引用了不存在的参数时,则抛出未经检查的异常。
|—MissingFormatWidthException(1.5):[->IllegalFormatException->IllegalArgumentException->RuntimeException]
|:请求格式宽度时抛出未经检查的异常。
|—UnknownFormatConversionException(1.5):[->IllegalFormatException->IllegalArgumentException->RuntimeException]
|:给定未知的转换时所抛出的未经检查的异常。
|—UnknownFormatFlagsException(1.5):[->IllegalFormatException->IllegalArgumentException->RuntimeException]
|:给定未知标志时所抛出的未经检查的异常。
|—MissingResourceException(1.1):[->RuntimeException]
|:缺少资源时抛出此异常。
|—java.lang.IllegalStateException(1.5):[->RuntimeException]【前边已经讲过该类了】
|—FormatterClosedException(1.5):[->java.lang.IllegalStateException->RuntimeException]
|:格式器已关闭时抛出的未经检查的异常。
|—NoSuchElementException(1.0):[->RuntimeException]
|:由Enumeration的nextElement方法抛出,表明枚举中没有更多的元素。
|—InputMismatchException(1.5):[->NoSuchElementException->RuntimeException]
|:由Scanner抛出,表明获取的标记与期望类型的模式不匹配,或者该标记超出期望类型的范围。
Exception(1.0)
|—TooManyListenersException(1.1):[->Exception]
|:TooManyListenersException异常用作Java Event模型的一部分来注释和实现多播Event Source的单播特例。
|—java.io.IOException(1.0):[->Exception]【前边已经讲过】
|—InvalidPropertiesFormatException(1.5):[->IOException->Exception]
|:当按照Properties规范,输入内容不符合属性集的正确XML文档类型,从而无法完成操作时,抛出此异常。
6)整理下来的异常树快照为:【异常列表:java.io、java.net、java.lang、java.text、java.util。】
java.lang.Exception(1.0):
|—java.lang.RuntimeException(1.0)
|—java.lang.ArithmeticException(1.0)
|—java.lang.ArrayStoreException(1.0)
|—java.lang.ClassCastException(1.0)
|—java.lang.EnumConstantNotPresentException(1.5)
|—java.lang.IllegalArgumentException(1.0)
|—java.lang.IllegalThreadStateException(1.0)
|—java.lang.NumberFormatException(1.0)
|—java.util.FormatterClosedException(1.5)
|—java.util.IllegalFormatException(1.5)
|—java.util.DuplicateFormatFlagsException(1.5)
|—java.util.FormatFlagsConversionMismatchException(1.5)
|—java.util.IllegalFormatCodePointException(1.5)
|—java.util.IllegalFormatConversionException(1.5)
|—java.util.IllegalFormatFlagsException(1.5)
|—java.util.IllegalFormatPrecisionException(1.5)
|—java.util.IllegalFormatWidthException(1.5)
|—java.util.MissingFormatArgumentException(1.5)
|—java.util.MissingFormatWidthException(1.5)
|—java.util.UnknownFormatConversionException(1.5)
|—java.util.UnknownFormatFlagsException(1.5)
|—java.lang.NegativeArraySizeException(1.0)
|—java.lang.IndexOutOfBoundsException(1.0)
|—java.lang.ArrayIndexOutOfBoundsException(1.0)
|—java.lang.StringIndexOutOfBoundsException(1.0)
|—java.lang.NullPointerException(1.0)
|—java.lang.SecurityException(1.0)
|—java.lang.TypeNotPresentException(1.5)
|—java.lang.UnsupportedOperationException(1.2)
|—java.util.ConcurrentModificationException(1.2)
|—java.util.EmptyStackException(1.0)
|—java.util.MissingResourceException(1.1)
|—java.util.NoSuchElementException(1.0)
|—java.util.InputMismatchException(1.5)
|—java.lang.InstantiationException(1.0)
|—java.lang.NoSuchFieldException(1.1)
|—java.lang.NoSuchMethodException(1.0)
|—java.lang.InterruptedException(1.0)
|—java.lang.ClassNotFoundException(1.0)
|—java.lang.CloneNotSupportedException(1.0)
|—java.lang.IllegalAccessException(1.0)
|—java.lang.URISyntaxException(1.4)
|—java.io.IOException(1.0)
|—java.util.InvalidPropertiesFormatException(1.5)
|—java.io.CharConversionException(1.1)
|—java.io.EOFException(1.0)
|—java.io.FileNotFoundException(1.0)
|—java.io.InterruptedIOException(1.0)
|—java.io.ObjectStreamException(1.1)
|—java.io.InvalidClassException(1.1)
|—java.io.InvalidObjectException(1.1)
|—java.io.NotActiveException(1.1)
|—java.io.NotSerializableException(1.1)
|—java.io.OptionalDataException(1.1)
|—java.io.StreamCorruptedException(1.1)
|—java.io.WriteAbortedException(1.1)
|—java.io.SyncFailedException(1.1)
|—java.io.UnsupportedEncodingException(1.1)
|—java.io.UTFDataFormatException(1.0)
|—java.net.UnknownServiceException(1.0)
|—java.net.UnknownHostException(1.0)
|—java.net.ProtocolException(1.0)
|—java.net.HttpRetryException(1.5)
|—java.net.MalformedURLException(1.0)
|—java.net.SocketException(1.0)
|—java.net.NoRouteToHostException(1.1)
|—java.net.PortUnreachableException(1.4)
|—java.net.BindException(1.1)
|—java.net.ConnectException(1.1)
|—java.text.ParseException(1.0)
|—java.util.TooManyListenersException(1.1)