Java 异常深度理解

异常

https://docs.oracle.com/javase/tutorial/essential/exceptions/definition.html
Definition: An exception is an event, which occurs during the execution of a program, that disrupts the normal flow of the program’s instructions.
翻译:异常是程序执行过程中发生的事件,它会中断程序的正常指令流。

规则

程序可以使用异常来表示错误的发生。要抛出异常,使用 throw 语句并提供一个异常对象(Throwable 的后代),以提供有关发生的特定错误的信息。抛出未捕获的受检查异常的方法必须在声明中包含 throws 子句。

程序可以通过使用 try、catch 和 finally 块的组合来捕获异常。

try 块标识一个可能会发生异常的代码块。
catch 块标识一个称为异常处理程序的代码块,可以处理特定类型的异常。
finally 块标识一个代码块,它保证会被执行,并且是关闭文件、恢复资源以及清理 try 块中包含的代码的正确位置。
try 语句应至少包含一个 catch 块或一个 finally 块,并且可以有多个 catch 块。

异常对象的类表示抛出的异常的类型。异常对象可以包含有关错误的进一步信息,包括错误消息。通过异常链,异常可以指向导致它的异常,而该异常又可以指向导致它的异常,以此类推。

分类

在这里插入图片描述
Exception和Error的区别,Exception能被程序本身可以处理,Error无法被程序处理。

通常,Java的异常(包括Exception和Error)分为可查的异常(checked exceptions)和不可查的异常(unchecked exceptions)。
Exception又分为:
1.可查异常(checked exceptions):是编译器要求必须处置的异常,正确的程序在运行过程中,很容易出现情理可容的异常状况。可查异常虽然是异常状况,但在一定程度上它的发生是可以预计的,而且一旦发生这种异常状况,就必须采取某种方式进行处理。除了RuntimeException及其子类以外,其他的Exception类及其子类都属于可查异常,最典型的是IO类异常。这种异常的特点是Java编译器会检查它,也就是说,当程序中出现了这类异常时,要么用try-catch语句捕获它,要么用throws子句声明抛出它,否则编译不会通过。
2.不可查异常(unchecked exceptions):编译器不要求强制处置的异常,包括运行时异常,即RuntimeException与其子类和错误(Error)。排除Error的情况,还可以将所有的Exception分为两大类:运行时异常和非运行时异常(非运行时异常也叫编译异常)。程序中应当尽可能的去处理这些异常。

代码

package com.exception.mark;

public class RuntimeExceptionTest {
    public static void main(String[] args) {
        /*
        Exception in thread "main" java.lang.ArithmeticException
        ArithmeticException extends RuntimeException
         */
        System.out.println(1/0);
    }
}

在这里插入图片描述
抛出运行时异常,非检查型异常

package com.exception.mark;

import java.io.FileInputStream;
import java.io.FileNotFoundException;

public class CheckExceptionTest {
    public static void main(String[] args) throws FileNotFoundException {
            /*
            FileNotFoundException extends IOException
            IOException extends Exception
             */
            FileInputStream fis=new FileInputStream("abc");

    }
}

在这里插入图片描述
抛出非运行时异常,检查型异常,如果不写try catch 或者throws语句,编译不通过

自定义异常

package com.exception.mark;

public class CustomerException extends Exception{
    public CustomerException() {
    }

    public CustomerException(String message) {
        super(message);
    }

    public static void main(String[] args) {
        //如果在某种条件下成立 则抛出自定义异常
        if(true){
            try {
                throw new CustomerException("have customer exception");
            } catch (CustomerException e) {
                //写一些code处理 然后再抛出异常
                throw new RuntimeException(e);
            }
        }
    }
}

通常,自定义的异常类应该包含两个构造器,一个是默认的构造器;另一个是带有详细描述信息的构造器

特殊情况 finally有return的情况

package com.exception.mark;

public class FinallyReturn {
    public static void main(String[] args) {

       int value= f();
        System.out.println("value:"+value);
    }

    public static int f(){

        try{
            return 1;
        }
        finally {
            return 2;
        }

    }
}


当finally子句包含return语句时,将会出现一中意向不到的结果。假设利用return语句从try语句块中退出。在方法返回前,finally子句的内容将被执行。如果finally子句中也有一个return语句,这个返回值将会覆盖原始的返回值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值