Exception异常处理和自定义异常

在程序中会出现各种错误我们叫做异常.
下面介绍一下如何处理可能会出现的异常.
导致程序中断的错误如下
Error: JVM出错了
不能处理,程序无法恢复

Exception : 代码逻辑错误,编程不严谨导致的 或者其他偶然的因素
可以处理,程序还能继续运行

运行时异常(unchecked): 编译器不要求我们处理的错误

异常(checked): 编译器要求我们必须处理的错误

创建一个Exception类,实现异常处理

public class ExceptionTest {


    public void tryCatchTest(int a,int b){

        // 使用try-catch捕获和处理异常

        try {
            // 可能会产生异常的代码
            System.out.println("准备开始除法计算");
            int c = a/b;
            System.out.println("除法计算正常运行");

            String text = null;
            int length = text.length();

        } catch (ArithmeticException e) {
            // try中产生异常以后,对异常进行处理
            // e就是捕获到的异常对象
            // 只要捕获到异常,程序就不会终止,继续向下执行
            // try中没有产生异常,catch中的代码

            System.out.println("程序产生异常");
            // 通常不适用Exception,而是使用具体的异常类型,让异常处理更具有针对性 

            // 获取异常的描述信息
            System.out.println(e.getMessage());

            // 打印异常产生的堆栈信息,方法调用过程,异常的位置
            e.printStackTrace();

        } catch (NullPointerException e) {

            // catch可以有多个,每个catch只处理一个异常
            System.out.println("产生了空指针异常");
        }finally {

            // finally是可选的,可写可不写
            // 无论是try还是catch执行完后都不会执行这里的代码

            System.out.println("finally执行了");
        }

    }


    // 声明方法时,可以通过throw说明当前可能产生的异常
    // 方法抛出异常,方法内不产生的异常不处理,抛调用方法来处理
    public void throwTest() throws ArithmeticException{

        int a = 10;
        int b = 0;

        int c = a / b;


    }

    public void addNumber(int a) throws NumberException{

        // 要求输入数字a<10

        if (a>10) {

            // 运行时异常由系统抛出
            // 自定义异常都是继承自Exception的 , 
            // 需要使用throw关键字手动抛出
            // 告诉方法的调用者,方法执行过程的各种产生错误,该如何处理
            throw new NumberException("你输入的数字大于10");
        }
        int b = a * 10;
    }
}

创建Text类, 调用.


public class Test {

    public static void main(String[] args) {


        // 空指针
//      String text = null;
//      int length = text.length();

        // 数组越界
//      int[] a = new int[5];
//      a[10] = 10;

        // 必须处理的异常,不处理就报错
//      FileInputStream fis = new FileInputStream("文件路径");

        // 处理异常的两种形式
        // 1.使用try-catch-finally语法处理
        //      自己处理
        // 2.使用throw和throws关键字交给方法的调用者进行处理
        //       交给别人处理

        // 抛出(throw)异常: 当我们程序运行产生异常,会自动生成异常对象,提交给JVM
        // 捕获(catch)异常: JVM收到异常对象后,自动寻找能够处理这个异常的代码,并把异常对象交给他

        // 如果找不到处理这个异常的代码,程序就崩溃 终止运行

        ExceptionTest et = new ExceptionTest();
        // et.tryCatchTest(10, 0);
        System.out.println("程序运行结束!");

        // 方法如果抛出普通异常,调用者必须使用try-catch捕获
        // 通过自定义异常告诉方法的调用者,出错的原因,由方法的调用者捕获异常决定如何处理
        try {
            et.addNumber(5);
        } catch (NumberException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            // 或者只打印错误类型 (就是写的那句话)
            System.out.println(e.getMessage());
        }       
    }
}

下边是自定义异常
创建一个class 继承自Exception 并点击创建构造方法
这个类的使用在上边的ExceptionTest类中的addNumber方法上,可参考上边使用.


// 自定义异常  继承自Exception 
// 并不是所有会导致程序崩溃的错误叫做异常 
// 所有不符合预期效果的现象都可以叫做异常
public class NumberException extends Exception{

    public NumberException() {
        super();
        // TODO Auto-generated constructor stub
    }

    public NumberException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
        // TODO Auto-generated constructor stub
    }

    public NumberException(String message, Throwable cause) {
        super(message, cause);
        // TODO Auto-generated constructor stub
    }

    public NumberException(String message) {
        super(message);
        // TODO Auto-generated constructor stub
    }

    public NumberException(Throwable cause) {
        super(cause);
        // TODO Auto-generated constructor stub
    }
}

你可能感兴趣的:(java基础)