Java异常详细笔记

文章目录

  • 1、异常体系
  • 2、异常处理机制
    • 2.1、try...catch
    • 2.2、多异常捕获
    • 2.3、try...catch...finally
    • 2.4、throws
    • 2.5、Java7增强的资源回收
    • 2.6、Java9增强的资源回收
  • 3、自定义异常
    • 3.1、主动抛出异常
    • 3.2、自定义异常

1、异常体系

Java异常详细笔记_第1张图片

   Java把所有的非正常情况细分为三类:Error(错误),RuntimeException(运行时异常),checked Exception(编译时异常)。

1.Error:一般是指与虚拟机相关的问题,如系统崩溃、虚拟机错误、宕机等等,这种错误无法恢复和不可捕获。
2.RuntimeException:RuntimeException简单说就是程序员自己犯的错误,这类错误需要自己检错来改正。如IndexOutOfBoundsException(索引越界异常)、ClassCastException(类型转换异常)等等,通常发生错误时,我们可以通过控制台报错信息找到目标进行修改。
3.checked Exception:Exception子类除了RuntimeException之外均是checked Exception,这类错误必须在编写代码时就对它们进行处理,采用try catch机制处理或者通过throws交由调用者来处理。

2、异常处理机制

2.1、try…catch

使用try…catch代码块可以捕获异常,捕获后可以继续执行后面的代码

/**
 * @author RuiMing Lin
 * @date 2020-03-06 18:02
 */
public class Demo1 {
     

    public static void main(String[] args) {
     
        String s = createExceptin();
        System.out.println("s = " + s);
    }
    
    static String createExceptin(){
     
        try {
     
            int i = 1/0;
        }catch (ArithmeticException exception){
     
            System.out.println("exception = " + exception);
        }
        return "我输出了吗?";
    }
}

2.2、多异常捕获

  老版本的jdk若是要捕获多个异常,需要写多个catch代码块。Java7新增了多异常捕获机制。

/**
 * @author RuiMing Lin
 * @date 2020-03-06 19:38
 */
public class Demo2 {
     
    public static void main(String[] args) {
     
        try {
     
            int i = 1/0;
            String s = "aaa";
            int i1 = Integer.parseInt(s);
        }catch (ArithmeticException | NumberFormatException exception){
     
            exception.printStackTrace();
        }
    }
}

2.3、try…catch…finally

  try…catch…finally代码块中finally是无论发生异常与否,均为执行其中的内容。通过用于进行回收资源。但也有例外,如果强制退出JVM,finally中的内容就不会得到执行。

import java.io.FileInputStream;
import java.io.IOException;

/**
 * @author RuiMing Lin
 * @date 2020-03-06 19:49
 */
public class Demo3 {
     
    public static void main(String[] args) {
     
        FileInputStream fileInputStream = null;
        try {
     
           fileInputStream = new FileInputStream("a.txt");//该文件实际上并不存在
        }catch (IOException ioe){
     
            System.out.println("找不到文件");
//            return;
            System.exit(1);
        }finally {
     
            if (fileInputStream != null){
     
                try {
     
                    fileInputStream.close();
                }catch (IOException ioe){
     
                    System.out.println("关闭文件出现异常");
                }
            }
            System.out.println("finally中的语句执行了吗");
        }
    }
}

  由代码可以看出使用在catch代码块中使用return仍然会执行finally中的语句,使用System.exit(1);则不会执行finally中的语句。

2.4、throws

使用throws是将异常抛出,谁调用该方法,谁就去处理它。

import java.io.FileInputStream;
import java.io.IOException;

/**
 * @author RuiMing Lin
 * @date 2020-03-06 20:19
 */
public class Demo5 {
     
    public static void main(String[] args) {
     
        method2();
    }
    static void method1() throws IOException {
     
        FileInputStream fis = new FileInputStream("aaa.txt");
    }

    static void method2(){
     
        try {
     
            method1();
        } catch (IOException e) {
     
            e.printStackTrace();
        }
    }
}

2.5、Java7增强的资源回收

  由上述代码知道,如果用finally进行流资源回收,当流资源比较多时,代码会非常冗长,显得十分臃肿。所以Java7对流资源回收进行了增强。只要该资源实现了AutoClosable或Closable接口,实现了close(),就可以使用增强回收功能。

import java.io.FileInputStream;
import java.io.IOException;

/**
 * @author RuiMing Lin
 * @date 2020-03-06 19:59
 */
public class Demo4 {
     
    public static void main(String[] args) {
     
        try (FileInputStream fileInputStream = new FileInputStream("a.txt");){
     

            //执行文件操作代码

        }catch (IOException ioe){
     
            
            ioe.printStackTrace();
        }
    }
}

2.6、Java9增强的资源回收

   Java9再次对资源回收进行了加强,只需将流资源定义为final类型的,便可以在try后面的括号里写上变量名即可。

3、自定义异常

3.1、主动抛出异常

程序员可以使用throw主动抛出异常

/**
 * @author RuiMing Lin
 * @date 2020-03-06 20:23
 */
public class Demo6 {
     
    public static void main(String[] args) {
     
        try {
     
            ageIsNormal(-2);
        } catch (Exception e) {
     
            System.out.println(e.toString());
        }

    }

    static void ageIsNormal(int age) throws Exception {
     
        if (age < 0){
     
            throw new Exception("年龄非法");
        }
        System.out.println("年龄为" + age);
    }
}

3.2、自定义异常

  用户自定义异常类应该继承Exception类或者RuntimeException类,然后定义属于自己的构造方法即可。

/**
 * @author RuiMing Lin
 * @date 2020-12-19 22:18
 * @description
 */
public class MyException extends Exception {
     
    public MyException(String message) {
     
        super(message);
        System.out.println("自定义异常生效了");
    }
}

   测试自定义异常

/**
 * @author RuiMing Lin
 * @date 2020-12-19 22:21
 * @description
 */
public class MyExceptionTest {
     
    public static void main(String[] args) {
     
        try {
     
            throw new MyException("myexception");
        } catch (MyException e) {
     
            String message = e.getMessage();
            System.out.println("message = " + message);
        }
    }
}

你可能感兴趣的:(Java,java,exception)