10.Java异常机制

1、什么是异常(Exception)

  • 异常是指程序运行中出现得不期而至得各种状况。如:文件找不到、网络连接失败、非法参数等待

2、异常体系结构

一、要理解java异常处理是如何工作得,需要掌握以下三种情况

  • 检查性异常:最具代表性得检查性异常是用户错误或者问题引起得异常,这是程序员无法预见得。例如要打开一个不存在得文件时,一个异常就发生了,这些异常在编译时不能被简单得忽略。

  • 运行时异常:运行时异常是可能被程序员避免得异常。于检查性异常相反,运行时异常可以在编译时被忽略

  • 错误(ERROR):错误不是异常,而是脱离程序员控制得问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,他们在编译也检查不到。

二、java把异常当作对象处理,并定义一个基类java.lang.Throwable,其结构如下:

10.Java异常机制

  • Error类对象是由java虚拟机生成并抛出,大多数错误与代码编写者所执行的操作无关。
  • Exception类对象一般由程序逻辑错误引起,程序应该从逻辑角度尽可能避免。

3、java异常处理机制

一、抛出异常

当异常发生时,java虚拟机会自动抛出异常并给与提示,也可以通过throw、throws主动抛出异常

  • throw:
    • 表示方法内抛出某种异常
    • 如果异常对象是非RuntimeException,则需要在方法体上加上throws抛出该异常,或者在方法体内用try、catch处理该异常,否则编译报错
    • 执行到throw语句则后面的语句不再执行
  • throws:
    • 在方法体上使用,表示这个方法可能抛出某种异常
    • 需要由方法的调用着进行异常处理
package com.exception;

import java.io.IOException;

public class Test1 {
    public static void main(String[] args) {
        try {
            testThrows(1,0);
        }catch (ArithmeticException e){
            System.out.println("Throws抛出异常");
        }

        try {
            testThrow(1,0);
        }catch (ArithmeticException e){
            System.out.println("Throw关键字抛出运行时异常,不需要在方法体上声明");
        }
        
        String filePath = null;
        try{
            testThrow(filePath);
        }catch (IOException e){
            System.out.println("Throw关键字抛出非运行时异常,需要在方法体加throws异常抛出声明");
        }


    }
    //测试Throws关键字
    public static void testThrows(int a,int b) throws ArithmeticException{
        System.out.println(a/b);
    }

    //测试Throw关键字抛出运行时异常
    public static void testThrow(int a,int b) {
        if (b == 0){
            throw new ArithmeticException();//运行时异常不需要在方法体上声明
        }
    }

    //测试Throw关键字抛出非运行时异常,需要在方法体加throws异常抛出声明
    public static void testThrow(String filePath) throws IOException {
        if (filePath == null){
            throw new IOException();//运行时异常不需要在方法体上声明
        }
    }
}

二、捕获异常

可以通过try、catch、finally关键字对异常进行捕获、处理。

package com.exception;

public class Test {
    public static void main(String[] args) {
        int a = 1;
        int b = 0;

        //捕获多个异常:异常的类型必须是从小到大捕获
        try {//try监控区域
            System.out.println(a/b);
        }catch (Error e){//catch后跟想要捕获地异常类型
            System.out.println("程序出现错误");
        }catch (Exception e){
            System.out.println("程序出现异常,除数不能为零");
        }catch (Throwable t){
            System.out.println("程序出现异常或者错误");
        }
        finally {//不管有不有异常发生都会被执行
            System.out.println("finally");
        }
    }
上一篇:Java中的异常处理


下一篇:异常类处理