Java,异常处理 - 教程

一、异常的概述
    -什么是异常?
    指的是程序在执行过程中,出现的非正常情况,如果不处理最终会导致JVM的非正常停止。
    -异常的抛出机制
    Java中把不同的异常用不同的类表示,一旦发生某种异常,就创建该异常类型的对象,并且抛出(throw),然后程序员就可以捕获(catch)到这个异常对象,并处理;如果没有捕获到异常对象,那么这个异常对象将会导致程序终止。
    -如何对待异常?
    对于程序出现的异常,一般有两种解决办法:一是遇到错误就终止程序运行。另一种是程序编写时,就充分考虑各种可能的异常或错误,极力预防和避免。

二、异常的体系结构及常见异常
    如图

三、异常处理的方式


    -try catch finally
        >基本结构:
            try
            {
                .....//可能产生异常的代码
            }
            catch(异常类型1 e)
            {
                .....//当产生异常类型1时的处理措施
            }
            catch(异常类型2 e)
            {
                .....//当产生异常类型2时的处理措施
            }
            finally
            {
                .....//无论是否发生异常,都会无条件执行的语句
            }
        >使用细节:
            ①将可能出现异常的代码声明在try语句中,一旦代码出现异常,就会自动生成一个对应异常类的对象,并将此对象抛出。
            ②针对try中抛出的异常类的对象,使用之后的catch语句进行匹配。一旦匹配上,就进入catch语句块进行处理。一旦处理接触,代码就可继续向下执行。
            ③如果声明多个catch结构,不同的异常类型在不存在子父类关系的情况下,顺序没有要求,但是如果存在子父类关系,则必须将子类声明在父类结构的上面。
            ④catch中处理异常的方式:自己编写输出语句;printStackTrace()打印异常详细信息;getMessage()获取发生异常的原因。
            ⑤try中声明的变量,在try外部无法使用。

import org.junit.Test;
import java.util.InputMismatchException;
import java.util.Scanner;
public class ExceptionHandTest
{
    @Test
    public void test1()
    {
        try
        {
            Scanner scan = new Scanner(System.in);
            int num = scan.nextInt();
            System.out.println(num);
        }
        catch (InputMismatchException e)
        {
            System.out.println("出现了InputMismatchException");
        }
        catch (NullPointerException e)
        {
            System.out.println("出现了NullPointerException");
        }
        catch (RuntimeException e)
        {
            System.out.println("出现了RuntimeException");
        }
        System.out.println("异常处理结束,代码继续执行");
    }
    @Test
    public void test2()
    {
        try
        {
            String str = "123";
            str = "abc";
            int i = Integer.parseInt(str);
            System.out.println(i);
        }
        catch (NumberFormatException e)
        {
            e.printStackTrace();
        }
        System.out.println("程序结束");
    }
}

    -throws
        >基本结构:throws 异常类型1,异常类型2...
        >使用细节:
            ①从编译的角度看,看成是给出异常出现时的解决方案。此方案就是继续向上抛出(throws)。
            ②throws的方式仅是将异常抛给了此方法的调用者,调用者仍然需要考虑如何处理相关异常,从这个角度看,throws的方式并不是真正意义上处理了异常。
            ③子类重写的方法抛出的异常类型可以与父类被重写抛出的异常类型相同,或是父类被重写方法抛出的异常类型的子类。

四、手动抛出异常对象
    -方法内部,满足指定条件下,使用"throw 异常类的对象"的方式抛出。

public class ThrowTest
{
    public static void main(String[] args)
    {
        Account account = new Account();
        try
        {
            account.regist(10);
            account.regist(-10);
            System.out.println(account);
        }
        catch (RuntimeException e)
        {
//            e.printStackTrace();
            System.out.println(e.getMessage());
        }
    }
}
class Account
{
    int id;
    public void regist(int id)
    {
        if(id>0)
        {
            this.id=id;
        }
        else
        {
            throw new RuntimeException("输入的id非法");
        }
    }
    @Override
    public String toString()
    {
        return "Account{" +
                "id=" + id +
                '}';
    }
}

五、自定义异常类
    -基本结构:
        ①继承于现有的异常体现。通常继承于RuntimeException \ Exception
        ②通常提供几个重载的构造器
        ③提供一个全局常量,声明为:static final long serialVersionUID;
    -使用细节:
        ①在具体的代码中,满足指定条件的情况下,需要手动使用"throw + 自定义异常类的对象"方式,将异常对象抛出。
        ②如果自定义异常类是非运行时异常,则必须考虑如何处理此异常类的对象。

posted on 2026-01-23 08:33  ljbguanli  阅读(1)  评论(0)    收藏  举报