Java 异常处理

383 阅读3分钟

这是我参与 8 月更文挑战的第 25 天,活动详情查看:8 月更文挑战

前言

本文主要讲解 Java 异常相关知识点,主要从以下三个方面着手:

  1. 何为异常
  2. 如何处理异常
  3. 如何自定义异常以及如何处理

什么是异常

  • 定义 : 导致程序正常流程被中断的事件,叫做 异常
  • 常见异常

其中 ThrowableErrorException 的父类; RuntimeException 不是必须进行 try catch 处理的异常;但 CheckedException 则是 必须进行处理的异常,要么 throws,要么 try catchError系统级别的异常

graph LR
A[Throwable] --- B[Exception]
A[Throwable] --- C[Error]
B[Exception] --- D[RuntimeException]
B[Exception] --- E[CheckedException]
E[CheckedException] --- F[IOException]
E[CheckedException] --- G[SQLException]
E[CheckedException] --- H[自定义 Exception]
D[RuntimeException] --- I[ArithmeticException]
D[RuntimeException] --- NullPointException
D[RuntimeException] --- ClassCaseException
D[RuntimeException] --- ArrayIndexOutOfBoundsException
D[RuntimeException] --- NumberFormatException

处理异常

对于异常的处理,我们通常有两种方式,第一种是通过 try …… catch 的方式,第二种则是通过 thorws 的方式,接下来我们就分别看看两种方式是如何处理异常的。

try catch

我们首先来看第一种通过 try……catch 的方式,它将可能抛出异常的代码部分放在 try 代码块中,若抛出异常,则立即跳出 tyr 代码块,转到对应 catch 块中;若没有抛出异常,则执行完 try 代码块部分后,不再执行对应 catch 块代码,而是直接顺序往下执行;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
 
public class TestException {
 
    public static void main(String[] args) {
         
        File f= new File("/home/cunyu/lol.sh");
         
        try{
            System.out.println("试图打开 /home/cunyu/lol.sh");
            new FileInputStream(f);
            System.out.println("成功打开");
        }
        catch(FileNotFoundException e){
            System.out.println("/home/cunyu/lol.sh 不存在");
            e.printStackTrace();
        }
         
    }
}

finally

常常与 try ... catch 同时使用,且无论 try 中是否出现异常,finally 代码块都会被执行;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
 
public class TestException {
 
    public static void main(String[] args) {
         
        File f= new File("/home/cunyu/lol.sh");
         
        try{
            System.out.println("试图打开 /home/cunyu/lol.sh");
            new FileInputStream(f);
            System.out.println("成功打开");
        }
        catch(FileNotFoundException e){
            System.out.println("/home/cunyu/lol.sh 不存在");
            e.printStackTrace();
        }
        finally{
            System.out.println("总会执行的代码");
        }
         
    }
}

throws

接着我们再来看第二种通过 throws 的方式,它主要用于当方法之间嵌套调用时,当内层方法不想对异常进行处理时,可以利用 throws 将异常抛出到上一层方法中,由上一层的方法处理;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
 
public class TestException {
 
    public static void main(String[] args) {
        method1();
 
    }
 
    private static void method1() {
        try {
            method2();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
 
    }
 
    private static void method2() throws FileNotFoundException {
 
        File f = new File("/home/cunyu/lol.sh");
 
        System.out.println("试图打开 /home/cunyu/lol.sh");
        new FileInputStream(f);
        System.out.println("成功打开");
 
    }
}
  • throwthrows 的区别
    • throws 出现在方法声明上,throw 通常出现在方法体内;
    • throws 表示可能出现异常,而 throw 则是抛出了异常,执行 throw 则一定抛出了某个异常对象;

自定义异常

创建自定义异常

要自定义异常,可以自定义一个异常类继承自 Exception,然后提供两个构造方法:

  1. 无参构造方法;
  2. 带参构造方法,同时调用父类对应构造方法;
public class MyException extends Exception{
    public MyException(){
        
    }
    
    public MyException(String msg){
        super(msg);
    }
}

抛出自定义异常

当创建自定义异常后,就可以创建一个自定义异常实例,然后利用 throw 在方法体内将其抛出,同时通过 throws 在方法上将该异常抛出;

public class Hero{
    public String name;
    protected float hp;
    
    class MyException extends Exception{
        public MyException(){

        }

        public MyException(String msg){
            super(msg);
        }
	}
    
    // throw 在方法体内抛出异常,throws 在方法上抛出异常
    public void attackHero(Hero h) throws MyException{
        if(h.hp == 0){
            throw new MyException("亚索已死");
        }
    }
    
}

总结

以上就是今天的所有内容了,主要介绍了异常简介、常见的处理异常的两种方式以及如何自定义异常并处理它。原创不易,如果你觉得我写的内容对你有所帮助,那就帮忙点赞关注吧!