曾经我觉得异常很高深,不断了解之后,有了更深刻的理解。
一、异常的含义

首先来说说什么是异常:所谓异常就是在程序运行时发生了错误来告诉运行者的一种机制
这与我们平时在敲代码时候遇到的将Println拼写错误时候报错不同,后者是在编译时期出错,前者是在运行时发生异常了。
运行时异常是已经编译通过生成了.class文件,在由JVM执行的时候发生了错误。

二、异常的解决办法

一般有两种解决办法:
1.在操作自谦就做充分的检查。
2.先操作,遇到问题再处理。

三、异常的基本使用方法

try{
有可能出现异常的语句 ;
}[catch (异常类型 异常对象) {
} … ]
[finally {
异常的出口
}]

说明:try里面是可能出现异常的代码。
catch代码块中放的是出现异常后的处理行为
finaliy代码块中的代码用于处理善后工作,例如释放资源。会在最后执行。
其中catch和finally都可以根据情况选择有无。

四、异常处理后的结果

我们仔细想一下在写程序时候,如果不对异常进行处理,那么程序在执行的时候遇到了异常,就会显示异常,异常后面的代码将不会被执行。
例如:
`

int[] arr={1,2,3};
        System.out.println(arr[5]);
        System.out.println("over");

这个代码是没有经过异常处理的,现在看他的执行结果:

java jni异常 java异常是什么意思_System


可以看出 程序就只执行到了异常位置。后面的内容没有被执行。

下面来对该异常处理一下:

int[] arr={1,2,3};
        try {
            System.out.println(arr[5]);
        }
        catch (ArrayIndexOutOfBoundsException e){
            e.printStackTrace();
        }
        System.out.println("over");

下面来看一下执行的结果:

java jni异常 java异常是什么意思_System_02


通过结果是可以看出来:在异常后面的代码被执行了,并且也把异常抛出了。

这就是手动处理异常的结果。其实如果我们不手动处理异常,那么就会交给JVM处理异常了,程序一旦遇到异常,JVM就会抛出异常,然后停止执行程序。如果我们手动捕获异常,那么一旦try块中出现异常,那么就会交给catch块中的代码来处理异常。当catch执行完毕后才会继续向下执行。

注意:

1手动捕获异常需要和异常类型匹配,否则还是会由JVM处理异常。

2catch可以有多个,分别捕获可能发生的异常类型。

3.如果有多个catch的时候,要将异常类的父类放在子类的下面,这样才符合逻辑。

4.Exception类是所有异常类的父类,因此可以用这个类型标识捕捉所有异常

五、异常处理流程

程序先执行try中的代码,如果try中的代码出现异常,就会结束try中的代码。看和catch中的异常类型是否匹配,如果找到匹配的异常类型,就会执行catch中的代码,如果没有找到就会将异常向上传递到上层调用者。如果上层调用者也没有找到匹配的异常类型,f就继续向上传递,一直到main方法也没有给出合适的代码处理异常,就会交给JVM来继续处理,此时程序就会异常终止。无论最终是否找到匹配的异常类型,finally中的代码都会被执行。

六.java的异常体系

在java内置了丰富的异常体系,用来表示不同情况下的异常。

下面来了解一下java内置的异常类之间的继承关系:

java jni异常 java异常是什么意思_异常类型_03


七、自定义异常

java中虽然内置了丰富的异常类,但是我们实际场景中可能还有一些情况需要我们对异常类进行扩展,创建符合实际情况的异常。

自定义异常构造方法:
 * 方法1:
 * public MyException(){
 *     super();
 * }
 * 方法二:
 * public MyException(String message){
 *     super(massage);
 * }
 * 方法三:
 * public MyException(String massage,Throwable cause){
 *     super(massage,cause);
 * }
 * 方法四:
 * public MyException(Throwable cause){
 *     super(cause);
 * }

下面是我使用用自定义异常捕获可能出现的异常写的一个登录的一个例子,希望通过这个例子可以对自定义异常有更深入的了解:

class UserError extends Throwable{
    public UserError(String infor){
        super(infor);
    }
}
class PasswordError extends Throwable{
    public PasswordError(String infor){
        super(infor);
    }
}
public class Exception {
    public static void lingo(String user,String password)throws UserError,PasswordError{

        if(!user.equals("caoliduo")){
            throw  new UserError("用户名错误!");
        }
        if(!password.equals("12345")){
            throw new PasswordError("密码错误!");
        }
        System.out.println("登陆成功!");
    }
    public static void main(String[] args){
        try{
            lingo("caoliduo","123456");
        }
        catch(UserError u) {
            u.printStackTrace();
        }
        catch (PasswordError p){
            p.printStackTrace();
        }
    }
}