Java-异常
1.异常的定义
异常是指程序在运行时期发生不正常的事件,它会打断指令的正常执行流程。
2.异常的分类(Throwable)
java.lang.Throwable
|-- Error错误:JVM造成的,如jvm系统内部错误,资源耗尽等严重问题,程序员无法处理。
|-- Exception异常:因为编程错误或偶然的外在因素导致的一般性的问题,程序员可处理。
|--RuntimeException:也叫非受检异常(unchecked exception).这类异常是编程人员的逻辑问题。
应该承担责任。Java编译器不进行强制要求处理。 也就是说,这类异常再程序中,
可以进行处理,也可以不处理。
|--非RuntimeException:也叫受检异常(checked exception),这类异常是由一些外部的偶然因素所引起的。
Error属于非受检异常,即除了该异常类,其他的都是非受检异常。
Java编译器强制要求处理。也就是说,程序必须进行对这类异常进行处理。
3.常见的异常
Error:AWTError,ThreadDeath
RuntimeException:NullPointerException,ArithmeticException,ClassCastException,ArrayIndexOutOfBundsException
非RuntimeException:SQLException,IOException,ClassNotFoundException,FileNotFoundException
RuntimeException
ArithmeticException:数学计算异常
NullPointerException:空指针异常
NegativeArraySizeException:负数组长度异常
ArrayOutOfBoundsException:数组索引越界异常
ClassNotFoundException:类文件未找到异常
ClassCastException:造型异常:当试图将对象强制转换为不是实例的子类时,抛出该异常
NumberFormatException:当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。
IOException
FileNotFoundException:文件未找到异常
EOFException:读写文件尾异常
MalformedURLException:URL格式错误异常
SocketException:Socket异常
4.异常处理机制
- Java程序在执行过程中如果出现异常,会自动生成一个异常类对象,该对象将被自动提交给JVM
- ------这过程称为抛出(throw)异常。
- 当JVM接收到异常对象时,会寻找能够解决这一异常的代码块,并将该异常对象交给它处理,这
- ------过程称为捕获(catch)异常和处理异常
- 如果JVM找不到处理该异常对象的代码,则运行时的系统会终止,相应的Java程序也会退出。
- 一旦出现异常,则首先会产生一个异常类的实例化对象
- try语句块会对其进行捕获。
- 产生的异常类对象会和各个catch语句里相应的异常类型匹配,匹配成功则执行相应的catch语句中的代码
4.1 try{...}语句:这是一次捕获并处理异常的范围,只捕获最先出现的异常。会产生一种或几种类型的异常对象
4.2 catch语句: 对异常进行处理的代码,可以有多个catch语句来处理不同类型的异常对象。
多重catch语句,“子上父下”,“一对一”异常子类必须在上面,而异常父类
在下面。它会对最先出现的异常进行捕获处理,其他之后出现的异常是不会
捕获的,只有一个匹配的catch语句执行,其他的不执行。如果没有异常发生
,则catch语句可以忽略。
4.3 finally语句:对异常处理的统一出口。无论try代码块中是否发生异常,finally语句块都会执行,
除非之前出现了System.exit(0),导致系统退出。finally语句是可选的.
finally语句块中经常进行资源的处理了工作:
1.关闭打开的文件。2.删除临时文件。3.关闭数据库的连接。
5.throws关键字
在定义一个方法的时候可以用Throws关键字声明,表示此方法不对异常处理,交给调用该方法的地方必须进行处理。
注意:对于抛出(throws)的异常必须catch处理,或者主函数将其抛出。
6.throw关键字
在方法的代码块中可以用它来抛出一个异常对象。
注意:如果throw的是一个受检异常(必须处理),则必须用throws 关键字在方法上声明抛出该异常。
7.Exception和RuntimeException
Exception:在程序中是必须进行处理的。
RuntimeException:(非受检异常)可以不用try....catch处理,如果出现异常,则交给JVM处理。
8.自定义异常
8.1 创建自定义异常:继承自Exception或其子类。习惯上包装一下父类的构造方法。
8.2 使用自定义异常:
public String[] createArray(intlength) throws MyException {
if (length < 0) { throw new MyException("数组长度小于0,不合法"); }
return new String[length]; }
8.3
- 观察抛出的异常的名字和行号很重要。
- 调用JDK提供的类的方法前,阅读其API文档了解它可能会产生的异常。
- ----然后再根据此决定自己是应该处理这些异常还是将其加入throws列表。
- ----应捕获和处理那些已知如何处理的异常,而传递那些不知如何处理的异常。
- 尽量减小try语句块的体积。
- 在处理异常时,应该打印出该异常的堆栈信息以方便调试。
对多异常的处理:
1,声明异常时,建议声明更为具体的异常。这样处理的可以更具体。
2,对方声明几个异常,就对应有几个catch块。不要定义多余的catch块。
如果多个catch块中的异常出现继承关系,父类异常catch块放在最下面。
注意:建立在进行catch处理时,catch中一定要定义具体处理方式。不要简单定义一句 e.printStackTrace(),
也不要简单的就书写一条输出语句。
异常在子父类覆盖中的体现;
1,子类在覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法,只能抛出父类的异常或者该异常的子类。
2,如果父类方法抛出多个异常,那么子类在覆盖该方法时,只能抛出父类异常的子集。
3,如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法时,也不可以抛出异常。
如果子类方法发生了异常。就必须要进行try处理。绝对不能抛