Java的Exception

103 阅读2分钟

Java的Exception

异常的分类

在这里插入图片描述 RunTimeException,都是我们平时出现的各种bug,说明这种报错编译的时候是不会报出来的

非RunTimeException,都是我们在写代码的时候就需要捕获的,说明编译都过不去如果不捕获处理的话

非RunTimeException异常的处理方式

try-catch

我们先来看一下如果我们如果不捕捉异常的话会怎么样,发现提示我们throws FileNotFoundException,说明我们不捕捉是不可以的,编译都过不去。 在这里插入图片描述 那我们就来捕捉一下 在这里插入图片描述 发现捕获了FileNotFoundException,在 fileReader.read(a)还是报错,提示需要捕捉IOException,但是我们知道IOException>FileNotFoundException,那我们就需要只捕捉IOException即可.

package learn;
​
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
​
public class MyExceptionOne {
    public static void main(String[] args)  {
        File file=new File("/Users/zc/IdeaProjects/daylywork/testException.txt");
        try {
            FileReader fileReader = new FileReader(file);
            char a[] = new char[50];
            fileReader.read(a);
            for (char c : a) {
                System.out.print(c);
            }
            fileReader.close();
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

捕获多个异常

我们在代码中再加入Thread.sleep(10000);提示需要同时捕获InterruptedException,因为InterruptedException和IOException没有从属关系,所以需要单独拉出来捕获一次,最后看异常是哪种,做出不同的处理

在这里插入图片描述

package learn;
​
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
​
public class MyExceptionOne {
    public static void main(String[] args)  {
        File file=new File("/Users/zc/IdeaProjects/daylywork/testException.txt");
        try {
            FileReader fileReader = new FileReader(file);
            char a[] = new char[50];
            fileReader.read(a);
            for (char c : a) {
                System.out.print(c);
            }
            fileReader.close();
            Thread.sleep(10000);
        }catch (IOException | InterruptedException e){
            if (e instanceof IOException){
                System.out.println("IOException");
            }
            if (e instanceof InterruptedException){
                System.out.println("InterruptedException");
            }
            e.printStackTrace();
        }
    }
}

比如我传入一个不存在的文件地址 在这里插入图片描述

try-catch-finally

无论是否出现异常,finally中的代码都会被执行 在这里插入图片描述

throws和throw的区别

throws

throws是作用在方法上的,比如说我们把异常不捕获了,直接抛出去,结果就是我们不处理,但是谁调用了我们的方法,就需要捕获这个异常,或者也抛出去,直到最后一个调用者。

就像下面的One没有捕获异常,抛出去了,那B也没捕获,也抛出去了,Theww就需要捕获才可以。

package learn;
​
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
​
public class MyExceptionOne {
    public static void One() throws IOException {
        File file=new File("/Users/zc/IdeaProjects/daylywork/testException.txt");
        FileReader fileReader = new FileReader(file);
        char a[] = new char[50];
        fileReader.read(a);
        for (char c : a) {
            System.out.print(c);
        }
        fileReader.close();
    }
    public static void Two() throws IOException {
        One();
    }
    public static void Theww(){
        try{
            Two();
        }catch (IOException e){
            e.printStackTrace();
        }
    }
    public static void main(String[] args)  {
        Theww();
    }
}

throw

throw其实就是手动抛出了一个异常,相当于你亲手创建了一个异常而已。

package learn;
​
import java.io.IOException;
​
public class MyExceptionOne {
    public static void One()  {
        IOException ioException = new IOException("这是我自己抛出的异常");
        try{
            throw ioException;
        }catch (IOException e){
            e.printStackTrace();
        }
    }
    public static void main(String[] args)  {
        One();
    }
}

结果

java.io.IOException: 这是我自己抛出的异常
  at learn.MyExceptionOne.One(MyExceptionOne.java:7)
  at learn.MyExceptionOne.main(MyExceptionOne.java:15)
​
Process finished with exit code 0

自定义异常

首先来自定义一个异常

package learn;
​
public class MyExceptionOne extends Exception{
    public MyExceptionOne(){
        super();
    }
    public MyExceptionOne(String s){
        super(s);
    }
}

再写一个测试类看看

package learn;
​
public class MyExceptionTwo {
    int a;
    public void setA(int a) throws MyExceptionOne{
        if (a!=0){
            throw new MyExceptionOne("a必须为0");
        }
        this.a=a;
    }
    public static void main(String[] args){
        MyExceptionTwo myExceptionTwo = new MyExceptionTwo();
        try{
            myExceptionTwo.setA(1);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

结果

learn.MyExceptionOne: a必须为0
  at learn.MyExceptionTwo.setA(MyExceptionTwo.java:7)
  at learn.MyExceptionTwo.main(MyExceptionTwo.java:14)