Java Exception、Error

Java异常类层次结构

                   +-----------+
                   | Throwable |
                   +-----------+
                    /         \
                   /           \
          +-------+          +-----------+
          | Error |          | Exception |
          +-------+          +-----------+
           /  |  \           / |        \
          \________/      \______/       \
                                     +------------------+
           unchecked     checked     | RuntimeException |
                                     +------------------+
                                       /   |    |      \
                                      \_________________/
                       
                                           unchecked
  • Error:一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢出等。如java.lang.StackOverFlowErrorJava.lang.OutOfMemoryError。对于这类错误,Java编译器不去检查他们。对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和预防,遇到这样的错误,建议让程序终止。
  • Exception:表示程序可以处理的异常,可以捕获且可能恢复。遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常。

常见的异常:

  • OutOfMemoryError:VirtualMachineError的子类,VirtualMachineError是Error的子类;
  • StackOverflowError:同上;
  • IOException:Exception的子类,属于checked exception。常见的子类有FileNotFoundException等。而IOError则是Error的子类;
  • RunTimeException:运行时异常,属于unchecked exception,其常见的子类有NullPointerException等

checked/unchecked Exception分类

  • unchecked exception:run-time exception + error;
  • checked exception:除了unchecked exception的其他所有异常,即除了RunTimeException及其子类、Error及其子类的所有Throwable的子类。

oracle英文原文见参考资料4。

两者的区别

  • checked exception:必须在代码中处理该Exception,否则会编译不通过。可以通过try-catch或throws让调用者处理;
  • unchecked exception:可能是代码逻辑错误引起的,但不处理也能编译通过

throw、throws

  • throw用在方法体内,是具体向外抛异常的动作,表示既定事实,如throw new Exception("error.");
  • throws用在函数声明中,表明该函数可能抛出某种类型的异常,需要调用者处理,表示倾向,如public void test() throws IOException

try-catch-finally、try with resources

// before Java 7:
try {
    // open resources like File, Database connection, Sockets etc
} catch (FileNotFoundException e) {
    // Exception handling like FileNotFoundException, IOException etc
} finally{
    // close resources
}

// Java 7 try with resources implementation:
try(// open resources here){
    // use resources
} catch (FileNotFoundException e) {
    // exception handling
}
// resources are closed as soon as try-catch block is executed.

Java 7之前必须显示的关闭,否则会导致内存泄漏

Java try with resources 的好处

  • 代码的可读性更好,更易于编写代码
  • 自动化的资源管理
  • 代码的行数被减少
  • 不需要使用finally块来关闭资源
  • 可在try-with-resources中使用分号来间隔多个资源,会在关闭时通过逆序的方式关闭

任何资源在用于 try-with-resources 时,都需要实现 java.lang.AutoCloseable,否则Java编译器会抛出编译问题

异常的日志打印

  • e:获取的信息包括异常类型和异常详细消息
  • e.getMessage:只会获得具体的异常名称. 比如说NullPoint 空指针,就告诉你说是空指针
  • e.printStackTrace:会打出详细异常,异常名称,出错位置,便于调试用...一般一个异常至少几十行

在使用slf4j打印异常时,不需要占位符,只需这么打印:logger.error("error = ", e);,下面这种是错误的:logger.error("error = {}", e);

参考资料

  1. Java中throws和throw的区别讲解
  2. logger.error用法
  3. Java Try with Resources
  4. Chapter 11. Exceptions
  5. Java 的 Checked 和 Unchecked Exception【译】
  6. Error和Exception的联系
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,179评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,229评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,032评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,533评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,531评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,539评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,916评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,813评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,568评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,654评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,354评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,918评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,152评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,852评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,378评论 2 342

推荐阅读更多精彩内容