【Java核心基础知识】08 - Java异常分类及处理

多线程知识点目录

多线程并发(1)- https://www.jianshu.com/p/8fcfcac74033
多线程并发(2)-https://www.jianshu.com/p/a0c5095ad103
多线程并发(3)-https://www.jianshu.com/p/c5c3bbd42c35
多线程并发(4)-https://www.jianshu.com/p/e45807a9853e
多线程并发(5)-https://www.jianshu.com/p/5217588d82ba
多线程并发(6)-https://www.jianshu.com/p/d7c888a9c03c

一、异常处理机制

当一个方法遇到错误或无法完成任务时,它会抛出一个异常。这个异常可以是检查型异常(例如在尝试读取一个不存在的文件时),也可以是非检查型异常(例如空指针异常)。

当一个异常被抛出时,当前方法的执行会立即停止,控制权会传递给最近的、能够处理该异常的代码块。这个代码块可能是在当前方法外部的代码,也可能是同一个方法中的另一个try-catch块。

另外,调用这个方法的其他代码也无法继续执行,异常处理机制会将代码执行交给异常处理器。

使用异常处理机制可以使程序更加健壮,能够处理并适当地响应在运行过程中可能出现的各种错误情况。良好的异常处理可以使程序更易于理解和维护,同时还可以提供更详细的错误信息,有助于调试和解决问题。

二、异常分类

异常分类

Throwable是Java语言中所有错误或异常的超类。其子类为:ErrorException

2.1 Error

是指Java运行时系统内部错误和资源耗尽错误。应用程序不会抛出该对象。如果出现了这样的错误,除了告知用户,剩下的就是尽力使程序安全的终止。

2.2 Exception

异常有两个分支,一个是运行时异常RuntimeException,一个是检查异常CheckedException

2.2.1 RuntimeException

代表了一组在运行时可能会出现的异常情况。RuntimeException类本身是所有运行时异常的基类,其子类代表了各种具体的运行时异常情况。例如空指针访问、数组越界等。这些错误通常是由于程序员的疏忽或错误导致的,而不是由于外部环境或不可预知的情况引起的。因此,Java编译器不会强制程序员显式地处理这些异常,而是在运行时抛出异常,由程序员自行处理。当一个RuntimeException被抛出时,当前方法的执行会立即停止,控制权会传递给最近的、能够处理该异常的代码块。如果没有找到匹配的异常处理代码块,程序会终止。因此,在编写Java代码时,程序员应该尽可能地避免出现RuntimeException,以确保程序的稳定性和健壮性。

常见的RuntimeException及其含义:

  • NullPointerException:当一个应用程序试图在需要对象的地方使用null时抛出。例如,调用一个空对象的实例变量或方法。
  • IndexOutOfBoundsException:当索引超出范围时抛出,例如访问数组或字符串时。
  • ArithmeticException:当出现异常的算术条件时抛出,例如除以零或浮点溢出。
  • IllegalArgumentException:当向方法传递了一个不合法或不正确的参数时抛出。
  • IllegalStateException:当方法处于非法或不合适的状态时抛出,例如关闭了一个已经关闭的流。

2.2.2 CheckedException

一般是外部错误,这种异常都发生在编译阶段,Java 编译器会强制程序去捕获此类异常,即会出现要求你把这段可能出现异常的程序进行 try catch,该类异常一般包括几个方面:

  1. 试图在文件尾部读取数据
  2. 试图打开一个错误格式的 URL
  3. 试图根据给定的字符串查找 class 对象,而这个字符串表示的类并不存在

三、异常的处理方式

3.1 捕获异常(try-catch)

当在try块中发生异常时,程序的控制流立即转移到相应的catch块。

try {  
    //可能会抛出异常的代码  
    int[] arr = new int[5];  
    arr[10] = 50; //会抛出ArrayIndexOutOfBoundsException  
} catch (ArrayIndexOutOfBoundsException e) {  
    //处理异常  
    System.out.println("数组越界");  
} finally {  
    //无论是否发生异常,这里的代码都会执行  
    System.out.println("程序结束");  
}

3.2 抛出异常(throw)

在Java中,可以使用throw关键字抛出一个异常。这必须在一个方法中完成,并且该方法必须使用throws关键字声明它可能抛出的异常。

public void printOwing(double amount) throws Exception {  
    if (amount > 1000) {  
        throw new Exception("OWING too much");  
    } else {  
        System.out.println("amount: " + amount);  
    }  
}

3.3 声明异常(throws)

当一个方法可能会抛出一个受检查的异常时,可以使用throws关键字声明该异常。这告诉编译器该方法可能会抛出异常,调用该方法的代码需要进行适当的异常处理。

public void printOwing(double amount) throws Exception {  
    if (amount > 1000) {  
        throw new Exception("OWING too much");  
    } else {  
        System.out.println("amount: " + amount);  
    }  
}

3.4 throwthrows的区别

位置不同

  1. throws 用在函数上,后面跟的是异常类,可以跟多个;而throw 用在函数内,后面跟的是异常对象。

功能不同

  1. throws 用来声明异常,让调用者只知道该功能可能出现的问题,可以给出预先的处理方式;throw 抛出具体的问题对象,执行到 throw,功能就已经结束了,跳转到调用者,并将具体的问题对象抛给调用者。也就是说 throw 语句独立存在时,下面不要定义其他语句,因为执行不到。
  2. throws 表示出现异常的一种可能性,并不一定会发生这些异常;throw 则是抛出了异常,执行 throw 则一定抛出了某种异常对象。
  3. 两者都是消极处理异常的方式,只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350