没掌握这几个JAVA异常关键点——你还怎么学好JAVA?(持续更新)

9 篇文章 0 订阅
2 篇文章 0 订阅

一. 异常是什么

异常是指阻止当前方法或作用域继续执行的问题。比如你读取的文件不存在,数组越界,进行除法时,除数为0等都会导致异常。

一个文件找不到的异常:


public class TestException {    
    public static void main(String[] args) throws IOException { 
        InputStream is = new FileInputStream("jaywei.txt"); 
        int b;  
        while ((b = is.read()) != -1) { 
        }   
    }   
}

运行结果:

Exception in thread "main" java.io.FileNotFoundException: jaywei.txt (系统找不到指定的文件。) 
    at java.io.FileInputStream.open0(Native Method)
    at java.io.FileInputStream.open(FileInputStream.java:195)  
    at java.io.FileInputStream.<init>(FileInputStream.java:138)  
    at java.io.FileInputStream.<init>(FileInputStream.java:93)   
    at exception.TestException.main(TestException.java:10)

二. 异常的层次结构

在这里插入图片描述从前从前,有位老人,他的名字叫Throwable,他生了两个儿子,大儿子叫Error,二儿子叫Exception。

Error
表示编译时或者系统错误,如虚拟机相关的错误,OutOfMemoryError等,error是无法处理的。

Exception
代码异常,Java程序员关心的基类型通常是Exception。它能被程序本身可以处理,这也是它跟Error的区别。

它可以分为RuntimeException(运行时异常)和CheckedException(可检查的异常)。

常见的RuntimeException异常:

  • NullPointerException 空指针异常

  • ArithmeticException 出现异常的运算条件时,抛出此异常

  • IndexOutOfBoundsException 数组索引越界异常

  • ClassNotFoundException 找不到类异常

  • IllegalArgumentException(非法参数异常)
    常见的 Checked Exception 异常:

  • IOException (操作输入流和输出流时可能出现的异常)

  • ClassCastException(类型转换异常类)

1、Checked Exception就是编译器要求你必须处置的异常。
2、与之相反的是,Unchecked Exceptions,它指编译器不要求强制处置的异常,它包括Error和RuntimeException 以及他们的子类。

三、异常处理

当异常出现后,会在堆上创建异常对象。当前的执行路径被终止,并且从当前环境中弹出对异常对象的引用。这时候异常处理程序,使程序从错误状态恢复,使程序继续运行下去。

异常处理主要有抛出异常、捕获异常、声明异常。如图:

在这里插入图片描述捕获异常

try{    
// 程序代码 
}catch(Exception e){    
//Catch 块   
}finaly{    
  //无论如何,都会执行的代码块   
}

我们可以通过 try…catch…捕获异常代码,再通过 finaly执行最后的操作,如关闭流等操作。

声明抛出异常
除了 try…catch…捕获异常,我们还可以通过throws声明抛出异常。

当你定义了一个方法时,可以用 throws关键字声明。使用了 throws关键字表明,该方法不处理异常,而是把异常留给它的调用者处理。是不是觉得TA不负责任?

哈哈,看一下demo吧

//该方法通过throws声明了IO异常。   
 private void readFile() throws IOException {   
        InputStream is = new FileInputStream("jaywei.txt"); 
        int b;  
        while ((b = is.read()) != -1) { 
        }   
    }

从方法中声明抛出的任何异常都必须使用throws子句。

抛出异常
throw关键字作用是抛出一个 Throwable类型的异常,它一般出现在函数体中。在异常处理中,try语句要捕获的是一个异常对象,其实此异常对象也可以自己抛出。

例如抛出一个 RuntimeException 类的异常对象:

throw new RuntimeException(e);

任何Java代码都可以通过 Java 的throw语句抛出异常。

注意点
非检查异常(Error、RuntimeException 或它们的子类)不可使用 throws 关键字来声明要抛出的异常。

一个方法出现编译时异常,就需要 try-catch/ throws 处理,否则会导致编译错误。

四、try-catch-finally-return执行顺序

try-catch-finally-return 执行描述

如果不发生异常,不会执行catch部分。

不管有没有发生异常,finally都会执行到。

即使try和catch中有return时,finally仍然会执行

finally是在return后面的表达式运算完后再执行的。(此时并没有返回运算后的值,而是先把要返回的值保存起来,若finally中无return,则不管finally中的代码怎么样,返回的值都不会改变,仍然是之前保存的值),该情况下函数返回值是在finally执行前确定的)

finally部分就不要return了,要不然,就回不去try或者catch的return了。

看一个例子


public static void main(String[] args) throws IOException {    
       System.out.println("result:" + test()); 
   }   
   private static int test() { 
       int temp = 1;   
       try {   
           System.out.println("start execute try,temp is:"+temp);  
           return ++temp;  
       } catch (Exception e) { 
           System.out.println("start execute catch temp is: "+temp);   
           return ++temp;  
       } finally { 
           System.out.println("start execute finally,temp is:" + temp);    
           ++temp; 
       }   
   }

运行结果:

start execute try,temp is:1
start execute finally,temp is:2
result:2

分析

先执行try部分,输出日志,执行 ++temp表达式,temp变为2,这个值被保存起来。

因为没有发生异常,所以catch代码块跳过。

执行finally代码块,输出日志,执行 ++temp表达式.

返回try部分保存的值2.

感谢观看!如果对你有所帮助,可以点个赞嘛!

顺便打个小广告,欢迎 Java 工程师朋友们私聊我领取免费的JAVA技术干货!
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值