JAVA学习笔记07——异常

异常

1.异常的概念与体系
异常:程序在执行过程中,出现的非正常的情况,最终导致JVM的非正常停止
Throwable体系:
Error:严重错误Error,无法通过处理的错误
Exception:异常,异常后程序员可以通过代码的方式纠正,使得程序继续运行

2.异常的处理

抛出异常throw
作用:
在指定的方法中抛出指定异常
语法:
throw new xxxException;
注意:
1.throw关键字必须写在方法内部
2.throw关键字后边new的对象必须是Exception或者Exception的子类对象
3.throw关键字抛出指定的异常对象,我们必须处理这个异常对象

public class Demo01 {
    
    
    public static void main(String[] args) {
    
    
        int[] array=null;
        int e=getElement(array,0);
        System.out.println(e);
    }
    public static int getElement(int[] array,int index){
    
    
        if(array==null){
    
    
            throw new NullPointerException("传递数组为空");
        }
        int res=array[index];
        return res;
    }   //运行期异常,默认交给JVM处理
}

3.声明异常throws
声明异常:将问题标识出来,报告给调用者。如果方法内通过throw抛出了编译时异常,而没有捕获异常,那么必须通过throws进行声明,让调用者处理
语法:
修饰符 返回值类型 方法名(参数) throws 异常类名1{}
注意:
1.throws关键字必须写在方法声明处
2.throws关键字后边声明的异常必须是Exception或者是Exception的子类
3.方法内部如果抛出了多个异常对象,那么throws后边必须也声明多个异常;如果抛出多个异常对象有子父类关系,那么直接声明父类异常即可
4.调用了一个声明抛出异常的方法,我们必须得处理声明的异常
要么继续使用throws声明抛出,交给方法的调用者处理,最终交给JVM
要么try …catch自己处理异常

public class Demo02 {
    
    
    public static void main(String[] args) throws FileNotFoundException {
    
    
        readFile("c:\\a.txt");
    }
    public static void readFile(String fileName) throws FileNotFoundException{
    
    
        if(!fileName.equals("c:\\a.txt")){
    
    
            throw new FileNotFoundException("传递路径不是c:\\a.txt");
        }
        System.out.println("路径没有问题,读取文件");
    }
}

4.捕获异常try…catch
如果异常出现的话,会立即终止程序,所以我们得处理异常:
1.该方法不处理,由该方法的调用者来处理(throws)
2.在方法中使用try…catch语句来处理异常
捕获异常:JAVA中对有针对性的语句进行捕获,可以对出现的异常进行指定方式处理
语法:
try{可能出现异常的代码
}catch(异常类型 e){}
处理异常的代码
}
注意:
1.try中可能会抛出多个异常对象,那么就可以使用多个catch来处理这些异常对象
2.如果try中产生了异常,那么就会执行catch中的异常处理逻辑,执行完毕catch中的处理逻辑,继续执行try…catch之后的代码;如果try中没有产生异常,那么不会执行catch中的处理逻辑,继续执行try…catch之后的代码

public class Demo02 {
    
    
    public static void main(String[] args){
    
    
        try{
    
    
            readFile("c:\\d.txt");
        }catch(FileNotFoundException e){
    
    
            System.out.println("传递文件路径错误");
        }
    }
    public static void readFile(String fileName) throws FileNotFoundException {
    
    
        if(!fileName.equals("c:\\a.txt")){
    
    
            throw new FileNotFoundException("传递路径不是c:\\a.txt");
        }
        System.out.println("路径没有问题,读取文件");
    }
}

Throwable类中定义了一些查看方法:
public String getMessage():获取异常的描述信息
public String toString():获取异常的类型和异常描述信息
public void printStackTrace():打印异常的跟踪栈信息并输出到控制台

public class Demo04 {
    
    
    public static void main(String[] args){
    
    
        try{
    
    
            readFile("c:\\d.txt");
        }catch(FileNotFoundException e){
    
    
            System.out.println(e.getMessage()); //传递路径不是c:\a.txt
            System.out.println(e.toString());   //java.io.FileNotFoundException: 传递路径不是c:\a.txt
            e.printStackTrace();    //全面信息
        }
    }
    public static void readFile(String fileName) throws FileNotFoundException {
    
    
        if(!fileName.equals("c:\\a.txt")){
    
    
            throw new FileNotFoundException("传递路径不是c:\\a.txt");
        }
        System.out.println("路径没有问题,读取文件");
    }
}

5.finally代码块
有一些特定的代码无论异常是否发生,都需要执行
注意:
1.finally不能单独使用
2.finally一般用于资源释放
语法:
try…catch…finally

public class Demo03 {
    
    
    public static void main(String[] args){
    
    
        try{
    
    
            readFile("c:\\d.txt");
        }catch(FileNotFoundException e){
    
    
            System.out.println(e.getMessage()); //传递路径不是c:\a.txt
        }
        finally{
    
    
            System.out.println("资源释放");
        }
    }
    public static void readFile(String fileName) throws FileNotFoundException {
    
    
        if(!fileName.equals("c:\\a.txt")){
    
    
            throw new FileNotFoundException("传递路径不是c:\\a.txt");
        }
        System.out.println("路径没有问题,读取文件");
    }
}

子父类异常:
如果父类抛出了多个一场,子类重写父类方法时,抛出和父类相同的异常或者是父类异常的子类或者不抛出异常
如果父类没有抛出异常,子类重写父类该方法时也不可抛出异常,此时子类产生该异常,只能捕获处理,不能声明抛出
6.自定义异常
注意:
1.自定义异常类一般都是以Exception结尾
2.自定义异常类,必须继承Exception或者RuntimeException
继承Exception:那么自定义的异常类就是一个编译期异常,如果方法内部抛出了编译期异常,就必须处理这个异常,要么throws要么try…catch
继承RuntimeException:那么自定义的异常类就是一个运行期异常,无需处理,交给虚拟机

public class RegisterException extends Exception{
    
    
    public RegisterException(){
    
    
        super();
    }
    public RegisterException(String message){
    
    
        super(message);
    }
}
public class Demo05 {
    
    
    static String[] usernames={
    
    "Kobe","James","Jordan"};

    public static void main(String[] args) {
    
    
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入用户名:");
        String username=sc.next();
        checkUsername(username);
    }
    public static void checkUsername(String username){
    
    
        for (String s : usernames) {
    
    
            if(s.equals(username)){
    
    
                try {
    
    
                    throw new RegisterException("用户已经被注册!");
                } catch (RegisterException e) {
    
    
                    e.printStackTrace();
                    return;
                }
            }
        }
        System.out.println("注册成功!");
    }
}

猜你喜欢

转载自blog.csdn.net/qq_44708714/article/details/106908340