15_JavaSE_异常处理

当我们设计的代码符合语法但不符合逻辑(例如访问的数组元素时索引越界等)或外界原因导致代码发生无法预料的情况发生,我们把这种情况称为异常(Exception)。

在 Java 中,Throwable 类有两个子类,一个是 Exception 类(定义的是我们上面所指的异常),一个是 Error类(指的是运行时环境发生的错误,例如:JVM 内存溢出等等)。在此基础上,Exception 类也有两个子类。一个是 IOException(输入输出异常),一个是 RuntimeException(运行时异常)。因此,所有的异常的“祖先”都是 Throwable 类。所以,我们来看看 Throwable 类有哪些方法:

public String getMessage()
返回关于发生的异常的详细信息。这个消息在Throwable 类的构造函数中初始化了。
public String toString()
返回此 Throwable 的简短描述。
public void printStackTrace()
将此 Throwable 及其回溯打印到标准错误流。。

那么我们如何捕获以及处理异常呢?

try
{
   // 可能存在异常的代码块
}catch(ExceptionName e1)//指定捕获什么异常类型
{
   //捕获之后需要处理什么
}

一般我们都是通过将有可能抛出异常的语句放到 try 代码块中,接着在 catch 括号中声明可能出现的异常(Exception 的子类或 Exception 类),如果出现指定范围的异常的话,catch 语句代码块将会被执行,而我们一般也会在 catch 语句中处理(处理时一般会打印异常(一般是通过getMessage、toString、printStackTrace这三个方法来打印))。例子如下:

public class Test {
    public static void main(String[] arg){
        try {
            int a = 3/0;
        }catch (Exception e){
            System.out.println("调用getMessage()方法并输出:");
            System.out.println(e.getMessage());
            System.out.println("调用toString()方法并输出:");
            System.out.println(e.toString());
            System.out.println("调用e.printStackTrace()方法");
            e.printStackTrace();
        }
    }

}
调用getMessage()方法并输出:
/ by zero
调用toString()方法并输出:
java.lang.ArithmeticException: / by zero
调用e.printStackTrace()方法
java.lang.ArithmeticException: / by zero
	at com.cs.study.config.Test.main(Test.java:13)

从上面例子我们可以看到这三者的区别:getMessage()方法返回一个字符串,内容是出现异常的原因,非常简洁(例子中,就只是说了你除以 0 了而已);toString()方法返回一个字符串,内容是出错的异常是属于哪个异常类以及出现异常的原因;e.printStackTrace()则不返回字符串,而是直接打印,内容包括出错内容的异常是属于哪个异常类、出现异常的原因,以及出错的位置在哪个类的哪个方法哪一行。

接着我们讲讲 throws/throw 关键字:
当我们的代码有可能存在异常时,但是我们不打算在当前方法就处理异常,那么我们可以选择把异常抛出去给调用者,让他来处理。这个时候我们需要在可能出现异常的方法后面指定 throws 关键字和异常类型。当代码出现异常时,会直接将异常抛给调用者去处理。(当然调用者也可以抛给上一个调用者)。

我们也可以在方法中直接指定抛出什么异常,这个时候可以直接用 throw 语句,并且指定异常类型,而且该方法要用 throws 说明抛出异常。

最后,我们说说 finally 关键字

try{
  // 程序代码
}catch(异常类型1 异常的变量名1){
  // 程序代码
}catch(异常类型2 异常的变量名2){
  // 程序代码
}finally{
  // 程序代码
}

finally 关键字与我们前面学的 final 关键字不一样,finally 是用于在 try 语句的后面,作用是,无论是否有异常,都会执行 finally 里面的代码(一般是一些关闭输入流输出流等操作,即不管操作成不成功都要执行的代码)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

执章学长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值