一、 异常的概念
异常:运行时发生的错误称为异常。
eg:数组下标越界
文件不存在
除数为0....
异常处理:处理这些异常就称为异常处理。
一旦引发异常,程序将突然中止,且控制将返回操作系统。
二、 异常处理的方法
Java中异常处理机制如下
1.在Java程序的执行过程中,如果出现了异常事件,就会生成一个 异常对象。
2.生成的异常对象将传递给Java运行时系统(JRE),这一异常的产生和提交过程称为“抛出(throw)异常”。
3.当JRE得到一个异常对象时,它首先寻找处理此异常的代码。如果找到能够处理这种类型异常的方法后,JRE把当前异常对象交给这个方法进行处理,这一过程称为捕获(catch)异常。
4.如果JRE找不到可以捕获异常的方法,则JRE将终止,相应的Java程序也将退出。
Error
一般不能由应用程序直接处理,必须交由操作系统处理。(硬件原因造成的运行错误)
Exception
运行时异常
RuntimeException的子类异常。Java编译器允许程序不对它们做出处理。
非运行时异常
除了运行时异常之外的其他由Exception继承来的异常类。Java编译器要求程序必须捕获 或声明这种异常,否则编译就报错。
三、 Try、catch、finally、throws、throw五个关键字
Java 中可用于处理异常的两种方式:
自行处理:可能引发异常的语句封入在 try 块内,而处理异常的相应语句则封入在 catch 块内。
回避异常:在方法声明中包含 throws 子句,通知潜在调用者,如果发生了异常,必须由调用者处理。
★try...catch
形式一:最基本的异常处理
try{
可能发生异常的代码块;
}catch(Exceptione){
异常处理
}
补充:
catch块中的异常处理一般有两种形式
1.System.err.println();输出异常信息
2.e.printStackTrace();建议使用这种
★finally
形式二:如果有些代码无论发生什么情况都需要执行,可以把这些代码放到finally块中
例如:数据库的关闭,网络的关闭等等....
try{
可能发生异常的代码块;
}catch(Exceptione){
异常处理代码块;
}finally{
一定需要执行的代码块;
}
注意:多重catch时,异常子类一定要位于异常父类之前
try{
…...
}catch(Exception e) {
……
}catch(ArrayIndexOutOfBoundsException e) {//此处报错,因为前面catch可以捕获所有异常,此处代码没用
……
}
★throws throw
public class TestException {
publicstatic void main(String[] args){
System.out.println("Hello");
try{
thrownew Exception("自己显示抛出的异常");//显示抛出异常
}catch (Exception e) {
e.printStackTrace();
}
}
}
importjava.io.*;
public classTest1 {
publicstatic void fun() throws FileNotFoundException{
//fun()方法中,会有异常,但是它抛出了异常,此异常给到调用他的方法处理。
FileInputStreamfis = new FileInputStream("D:\\1.txt");
}
publicstatic void main(String[] args){
try{
fun();//main方法中调用了fun(),必须要处理fun()中抛出的异常
//main方法可以继续抛出(给到虚拟机处理),也可以用try...catch捕获
}catch (FileNotFoundException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
}
}
四、 自定义异常
JavaAPI提供的内置异常不一定总能捕获程序中发生的所有错误。有时会需要创建用户自定义异常
自定义异常需要继承Exception 及其子类
案例:
classMyException extends Exception{/自定义异常
publicMyException(){
super("我自己定义的异常!");
}
}
public classTestException {
publicstatic void main(String[] args){
try{
thrownew MyException();
}catch (Exception e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
}
}