摘要:所幸,提供了一套机制,用于在程序程序出错出现异常时,进行报告错误保存工作结果让用户以更完善的方式退出程序亦即异常处理机制。顾名思义,该机制用于对程序运行中不正常的情况进行处理。如抛出比更加语义化学会把异常传递,即早抛出,晚捕获
初识
代码的世界和现实世界一样,不会一帆风顺,起码不会像我们想象中的那么顺利。写代码的是人,人的思维存在局限性,这种局限性,体现在代码中,就是漏洞。倘若一段程序在生产环境中崩溃,势必让人十分恼火。这种让人头大的情况就是异常的一种。
Java 是这样定义异常的:
异常指的是,那些在程序运行过程中,中断正常的指令流程的事件。
实际上,异常还会在以下场景中发生:
用户输入错误,如:输入不符合程序预期
设备错误,如:网线断开连接
物理限制,如:内存不足
而我们并不希望程序因为上述情况挂掉,而是希望程序能够在遇到异常时,巧妙地处理之后,继续运行下去。
所幸,Java 提供了一套机制,用于在程序程序出错(出现异常)时,进行:
报告错误
保存工作结果
让用户以更完善的方式退出程序
亦即:异常处理机制。顾名思义,该机制用于对程序运行中不正常的情况进行处理。
简单来说,Java 中的异常处理是:当异常发生时,运行时系统逆着方法的调用栈(call stack)去寻找能够处理这种异常的东西。
以一个把字符串转换成整数的方法为例:
public Integer stringToNumber(String strToFormat){ Integer targetNum; try{ targetNum = new Integer(strToFormat); }catch(NumberFormatException e){ targetNum = DEFAULT_NUM; } return targetNum; }
在上述代码中,当 strToFormat 不能转化成一个整形数时,就转化成一个默认的值。NumberFormatException 发生时,方法立即终止。控制权被交由 catch 代码块,也就是异常处理器(exception hanlder)。代码虽然简单,却包含了 Java 异常处理的一般步骤。
异常分类在 Java 中,所有的异常派生于 Throwable 接口。这些异常,又被分为 Error 和 Exception。这两类异常,又衍生了一些子类。下面的图片,描述了 Java 的异常体系图:
不过,我们应当把精力放在 RuntimeException 上,因为“所有的运行时异常,都是程序员的问题”。这类异常,又被叫做未检查异常,通常交由 JVM 处理。相对应的,那些我们知道可能会出现问题、,被叫做已检查的异常。这类异常需要开发者手动向上级抛出,直到 JVM 级别,或者在调用方法时使用 try-catch 处理。
一般来说,在写一个方法时,要尽可能声明所有已检查异常,通过内部逻辑控制,避免未检查(运行时)异常。
异常捕获在编码过程中,如果方法的检查异常被精心设计,那么我们只管抛出异常即可。但是,一旦调用方法的地方没有对这种可能出现的异常进行处理,那么程序就会终止。所以,要对异常进行捕获操作,正如之前的字符串转数字的方法一样。
根据经验,程序中应该捕获那些知道如何处理的异常,把“职责”外的异常,交给方法的调用者去处理。下面是一个异常捕获流程的示例代码:
modifier returnType someMethod(type1 param1, type2 param2) throws Exception1, Exceptio2{ try{ ① // 某些操作 return returnType value; }catch(Exceptionx | Exceptiony e){ ② // 处理异常 }catch(Excpetion1 e1){ ③ throw new Excption1(e1); }catch(Exception e2){ ④ throw e2; }finally{ ⑤ // 一些操作 return returnType mockValue; } }
在上述代码中,① 中进行操作,捕获了 Exeptionx 或者 Exceptiony 时,② 进行异常处理;捕获了 Exception1 时, ③ 把该异常包装;捕获了 Exception 2 时,④ 直接抛出异常;无论有无异常发生,⑤ 都会执行。
上面的代码还有一个问题,就是 finally 代码中包含返回值。有以下规则:
try 代码块中包含 return 语句,finally 语句中的代码也会被执行;若 finally 中也包含 return 语句,则会替代 try 中的语句
使用异常的技巧不要过分细分异常,能用一个 try 块处理的尽量用一个,然后按层次捕获异常,下面的代码是被建议的:
try{ // 某些操作 }catch(SomeException1 e1){ // 异常 1 的处理 }catch(SomeException2 e2){ // 异常 2 的处理 }
适当地转化异常,如:可以把一个 NumberFormatException 转化成自定义的异常
遇到异常情况,可以更加严格一点。如:抛出 EmptyStackException 比 NullPointerException 更加语义化
学会把异常传递,即:「早抛出,晚捕获」
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/71174.html
摘要:本人生性愚钝,在大学期间没能好好领略等面向对象编程的魅力。现借助一些较为权威的书籍资料,将基础知识里比较重要的东西整理成文,命名从基础学。如果博文不慎侵犯了您的著作权,请联系我。 和很多大学一样,我的学校也是从 Java 、C++ 入手,教给我们面向对象 (OOP) 的思想。本人生性愚钝,在大学期间没能好好领略 Java 等面向对象编程的魅力。现借助一些较为权威的书籍资料,将 Java...
摘要:进阶多线程开发关键技术后端掘金原创文章,转载请务必将下面这段话置于文章开头处保留超链接。关于中间件入门教程后端掘金前言中间件 Java 开发人员最常犯的 10 个错误 - 后端 - 掘金一 、把数组转成ArrayList 为了将数组转换为ArrayList,开发者经常... Java 9 中的 9 个新特性 - 后端 - 掘金Java 8 发布三年多之后,即将快到2017年7月下一个版...
摘要:的作用是为其他线程的运行提供服务,比如说线程。在某些平台上,指定一个较高的参数值可能使线程在抛出之前达到较大的递归深度。参数的值与最大递归深度和并发程度之间的关系细节与平台有关。 今天研究了下Java线程基础知识,发现以前太多知识知识略略带过了,比较说Java的线程机制,在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程),以及构造器中的s...
摘要:最近有不少初学编程的朋友问他们比较倾向于和作为他们首选学习语言,但是学好呢还是学更有前途到底哪一门语言更有钱途呢这个问题问的好,很多初学者都会有类似的疑问,今天我就来给大家简单的解答一下。 最近有不少初学编程的朋友问:他们比较倾向于Java和C++作为他们首选学习语言,但是...
摘要:包含了支持服务开发的类,并为提供基础,如语言基础操作操作网络通信以及多线程等技术。在运行文件时,的解释器对这些字节码进行解释执行,执行过程中需要加入的类在连接阶段被载入到运行环境中。支持多个线程同时执行,并提供多线程之间的同步机制。 1.什么是Java语言 简单地说,Java 是由 Sun Microsystems 公司于 1995 年推出的一门面向对象程序设计语言。2009 年 Or...
阅读 1777·2023-04-26 02:32
阅读 550·2021-11-18 13:12
阅读 2417·2021-10-20 13:48
阅读 2501·2021-10-14 09:43
阅读 3791·2021-10-11 10:58
阅读 3434·2021-09-30 10:00
阅读 2914·2019-08-30 15:53
阅读 3470·2019-08-30 15:53