当前位置: 首页 > news >正文 广州做网站公司哪家好建设了湛江市志愿服务网站 news 2025/11/5 11:12:11 广州做网站公司哪家好,建设了湛江市志愿服务网站,建程网app下载,四川成都最新新闻事件今天Java异常控制机制又被称为“违例控制机制”。 捕获程序错误最理想的时机是在编译阶段#xff0c;这样可以彻底避免错误的代码运行。但并非所有的错误都能在编译期间侦测到#xff0c;有些问题必须在运行期间解决。 错误在运行期间发生时#xff0c;我们可能不知道具体应该怎… Java异常控制机制又被称为“违例控制机制”。 捕获程序错误最理想的时机是在编译阶段这样可以彻底避免错误的代码运行。但并非所有的错误都能在编译期间侦测到有些问题必须在运行期间解决。 错误在运行期间发生时我们可能不知道具体应该怎样解决但我们清楚此时不能不管不顾地继续执行下去。此时应该做的事情是 暂停程序的运行指出何时、何地发生了什么样的错误可能的话应处理此错误并恢复程序的执行 Java异常控制机制的作用流程 异常产生 首先程序引擎需要能够获知异常的产生。Java中预置了一系列基本的异常条件如数组下标越界、空指针、被零除等等这些异常是由JVM自动产生的(也被称为运行时异常见后)另一部分异常则是由Java代码(可能是JDK的代码或开发人员自己编写的代码)产生的(也被称为checked异常见后)。 异常产生即是异常对象的实例化该对象的类型通常就说明了异常条件的类型实例化的异常对象中还会包含对异常条件的补充说明(message)以及异常发生时的线程调用栈信息(stacktrace)。 在这个环节中JAVA完成了对错误的描述包括错误发生的时间、错误的类型(即异常对象的Class)、对错误的描述(message)和错误发生的位置(stacktrace)。异常抛出 异常抛出是JAVA程序流中的一种特殊流程当异常产生后JVM会停止继续执行后面的代码并将异常对象抛出。抛出的异常对象会进入调用栈的上一层如果异常对象没有被捕获它会沿着调用栈的顺序逐层向上抛出直至调用栈为空此时该线程的运行也就彻底终止了。 异常的抛出解决了当前作用域可能不具备处理异常所需的信息的问题将异常对象在调用栈中逐级向上传递直至有能力处理异常的作用域将其捕获。异常捕获 在异常对象逐级向上抛出的过程中如果调用栈中某一层有捕获该类型异常的逻辑该异常对象便会被捕捉异常被捕获后JVM会终止抛出异常对象的过程。异常处理 当异常对象被捕获后JVM会执行捕获后的处理逻辑(处理逻辑是由程序员编写的)。当处理逻辑执行完成后JVM会继续执行捕获了异常的作用域中接下来的代码(除非异常处理逻辑中将该异常继续抛出或异常处理逻辑中产生了新的异常)。 try-catch-finally 前文所述的异常控制流程在JAVA程序中以try-catch-finally结构实现 try块也被称为“警戒区”try块包裹的代码在执行过程如果产生异常或其调用栈的下层中产生了异常并被抛至本层则会被与此try块关联的catch命令尝试捕获。若异常产生于警戒区之外则会直接向上层抛出。catch命令后的括号内指定希望捕捉的异常对象类型(可以指定多个)如果产生或被抛至此层的异常对象是catch指定的异常类型(或其子类)则异常对象会被捕捉。上例中所有Exception对象及其子类的对象在此处均会被捕获。被捕获后JVM会执行catch块中的代码catch块中的代码能够访问被捕捉到的异常对象(即上例中的Exception e)。 catch块中的代码仍然有可能产生异常所以也可以在catch块中插入try-catch-finally。finally块为可选块如果有则无论是否有异常被抛出JVM都会在try-catch块执行完成后执行finally块中的代码。 Exception与Error 前文所述的Java异常控制机制实际上并不仅对“异常”起作用。除了我们所说的异常(Exception)能够被产生、抛出和捕捉之外还有另一种类型“错误(Error)”。 Java中Throwable是所有可以被抛出并捕获的类的父类。Throwable有两大子类分别是Exception和Error。 Java官方并没有给出Error和Exception的严格定义而是将Error描述为“应用程序不应尝试捕捉处理的严重问题”Exception则是“应用程序应该尝试捕捉处理的问题”。 我们从几个例子看一下 NoClassDefFoundErrorJVM的ClassLoader在尝试加载某个类但该类在Classpath中并不存在时会产生的错误。例如a.jar依赖b.jar中的某个类如果我们使用编译完成的a.jar时并没有引入b.jar编译器并不会发现问题(因为a.jar已经完成了编译需要编译的代码中只使用了a.jar中的api并没有直接使用b.jar)但在运行时JVM找不到b.jar中被a所依赖的类便会发生错误。UnsupportedClassVersionError当JVM尝试加载一个class但发现该class的版本并不被支持时产生的错误。例如我们使用JDK1.8开发并编译一个类但在JDK1.7的环境中运行时便会发生此错误OutOfMemoryError当JVM内存不足无法为一个对象分配内存时发生的错误例如堆区内存溢出、Perm区内存溢出等。StackOverFlowError当程序的递归调用过深导致线程调用栈溢出时发生的错误。NoSuchFieldError/NoSuchMethodError当JVM试图访问某个成员属性或某个方法时发现目标不存在。一般都是由于class信息在运行时被改变导致的多见于使用反射时。 通过上面的例子能够看出Error一般都与程序本身的直接关系不大更多是由于环境导致的问题。而且Error发生后通常程序都没有再继续执行下去的可能性所以Java官方将其定义为“应用程序不应尝试捕捉处理的严重问题”。 Exception的分类 Java将Exception分为两类checked异常和unchecked异常也被称为非运行时异常和运行时(runtime)异常。 RuntimeException是Exception的一个子类RuntimeException的子类都属于unchecked异常(也就是运行时异常)其他所有的Exception都是checked异常(也就是非运行时异常)。 这两种异常的区别从字面上即可理解checked代表“必须被check”而unchecked代表“无须被check” Java要求checked异常必须被在代码编写阶段就调用者了解unchecked异常则不用。如果一个方法中有可能产生checked异常则Java编译器会要求该方法定义中必须加入throws定义明确说明该方法可能会抛出某类checked异常。如下图 foo方法可能产生IOException(这是一种checked异常)所以bar方法在调用foo时编译器会提示错误。此时可以在bar方法的定义行中加入throws public void bar() throws IOException 也可以在bar方法内将IOException捕获处理 图片.png 另一个理解checked异常与unchecked异常区别的角度是所有由JVM自动生成的异常都是unchecked异常反之由java程序主动生成的异常是checked异常。 例如 上图中f.createNewFile()方法可能会产生checked异常IOException我们看看File类的源码 这里写图片描述 可以看到红框处IOException异常是在代码中被主动抛出的凡是这样在代码中主动抛出的异常都是checked异常。 相应地unchecked异常是JVM在运行时自动产生的例如下图的方法只要传入的参数b等于0就会在运行时自动产生ArithmeticException 代码中永远不需要这样写 异常处理的原则 异常处理的原则主要有三个 具体明确提早抛出延迟捕获 具体明确 指抛出的异常应能通过异常类名和message准确说明异常的类型和产生异常的原因。 我们通过例子来看 代码1 代码2 这两段代码的处理逻辑是类似的均是在入参input1或input2为null或空串时抛出异常但只有第二段符合“具体明确”的标准 首先第二段代码通过异常类型【IllegalArgumentException】明确了异常是由于传入了不合法的参数导致的其次在message中说明了具体是哪个参数不合法为什么不合法。这样不仅能够在查阅日志时快速知晓异常产生的原因也让上层的程序能够针对IllegalArgumentException这一特定类型的异常进行有针对性的捕捉和处理。 相比之下第一段代码中抛出的异常就不够具体明确异常类型Exception不具有说明性质异常message也不够明确上层程序难以处理阅读日志时也难以快速定位。 提早抛出 指应尽可能早的发现并抛出异常便于精确定位问题。 同样通过例子来看 代码1 代码2 在传入的filename为null时这两段代码都会抛出异常第一段代码抛出的异常是 第二段代码抛出的异常是 第一段代码抛出的异常是在标准Java类库【InputFileStream】中抛出的这首先就提升了问题定位的难度不过幸好stacktrace中也打印出了前面的调用链我们可以在标准类库的调用者身上查找问题(可以定位到Test.java的第38行)。 同时NullPointerException是Java中信息量最少的(却也是最常遭遇且让人崩溃的)异常。它压根不提我们最关心的事情到底哪里是null。在稍微复杂一些的场景中(如一行代码中有多处都可能导致NullPointerException)会让人更加崩溃。 而相比之下第二段代码对filename提前进行了校验并以IllegalArgumentException的形式抛出这样在第一段代码中遇到的两个问题都可以得到解决这便是提早抛出的好处。 延迟捕获 指异常的捕获和处理应尽可能延迟让掌握更多信息的作用域来处理异常。 代码1 上面的代码中readSomeFile方法将new FileInputStream处有可能产生的FileNotFoundException捕获并将异常信息记录到了日志中。 这么做看起来似乎没什么问题但readSomeFile这个方法有可能是一个通用的底层方法会在各种业务场景下被调用不同的业务场景下发生FileNotFoundException时的处理策略可能不一样(例如某些场景要求记录异常并告警某些场景会使用其他文件名重试)但readSomeFile方法并不知道自己所处的业务场景是什么样的这一信息只有更上层的作用域才了解所以在方法内部直接捕获并处理异常的做法就显得有问题了程序将无法通过甄别业务场景来执行不同的异常处理逻辑。 代码2 第二段代码看起来反而更加简单了没有对FileNotFoundException加以处理而是直接在方法定义中将其抛出。然而在上面所述的场景下这种处理方式反而是正确的。将异常抛出交由掌握了足够多信息的上层调用者捕获这样就可以根据异常产生所处的具体业务流程来进行不同的处理。 例如我们可以在一个业务逻辑中这样处理 同时在另一个业务逻辑中这样处理 其他重要原则 不要让异常逃掉 当一个异常在整个调用栈中的任意一层都没有被捕获这个异常就“逃掉”了。这对于任何程序来说都是一个灾难性的事件。 对于B/S系统从请求处理线程中逃掉的异常很可能会被B/S框架(如Struts/SpringMVC等)捕捉到。如果没有正确配置这些逃掉的异常很可能就被框架“吃掉”了即框架捕获了从业务代码层抛出的异常且没有记录或没有完整记录异常信息。这样的异常来无影去无踪完全无迹可寻堪称程序员的大敌。 某些情况下异常会被抛到中间件或容器(Tomcat/Jboss/Weblogic/Websphere等)层(可能是没有使用B/S框架或B/S框架没有“吃掉”异常)。被中间件或容器捕获到的异常一般情况下会被记录在中间件或容器自己的日志中(也有可能不会记)但问题在于这种情况下用户会看到中间件或容器提供的错误页这些错误页基本没有用户友好型可言而且有可能会把异常堆栈的信息直接显示在页面上在开放性的系统中暴露堆栈信息极有可能引发严重的安全问题。 而在后台进程中如果异常逃掉了将会导致线程的退出。如果没有守护线程及时补充异常退出的线程那么将有可能发生整个进程因为异常而中止的灾难性后果。 所以说在编程时应绝对避免异常“逃逸”的情况对于B/S系统来说我们可以在每个Action中都加入try-catch块捕获所有Exception也可以利用B/S框架的特性来实现从Action层抛出的异常的统一处理(如Struts2和SpringMVC都有的拦截器机制)。对于后台进程来说可以利用try-catch块避免异常导致线程中止也可以通过添加守护线程来及时补充因异常而退出的线程同时还应使用Thread.setDefaultUncaughtExceptionHandler来确保未捕获异常的正确记录。正确记录异常信息 即在异常的stacktrace信息完整、未缺失的基础上确保异常的stacktrace被正确记录到日志中 错误的做法 上面的5种处理全都是错误的前两种将异常信息输出到了控制台而不是日志文件中。后三种错误的使用了log4j的error方法均没有正确记录异常的stacktrace 正确的方法 注意应使用正确的error方法传入两个参数参数1是对异常的附加描述参数2是未被篡改过的异常对象 在某些情况下可能需要在处理异常后继续抛出让上层捕获后继续处理在这种情况下需要注意抛出的异常对象未被篡改。 错误的 如果像上图这样写的话下层的异常stacktrace会全部被吃掉。 正确的写法 文章转载自: http://www.morning.fpqsd.cn.gov.cn.fpqsd.cn http://www.morning.ndpwg.cn.gov.cn.ndpwg.cn http://www.morning.thwcg.cn.gov.cn.thwcg.cn http://www.morning.diuchai.com.gov.cn.diuchai.com http://www.morning.qggxt.cn.gov.cn.qggxt.cn http://www.morning.qstjr.cn.gov.cn.qstjr.cn http://www.morning.yrjkp.cn.gov.cn.yrjkp.cn http://www.morning.iterlog.com.gov.cn.iterlog.com http://www.morning.jfzbk.cn.gov.cn.jfzbk.cn http://www.morning.fdzzh.cn.gov.cn.fdzzh.cn http://www.morning.bzwxr.cn.gov.cn.bzwxr.cn http://www.morning.xrrbj.cn.gov.cn.xrrbj.cn http://www.morning.saastob.com.gov.cn.saastob.com http://www.morning.crxdn.cn.gov.cn.crxdn.cn http://www.morning.yqsr.cn.gov.cn.yqsr.cn http://www.morning.cwrpd.cn.gov.cn.cwrpd.cn http://www.morning.rlns.cn.gov.cn.rlns.cn http://www.morning.hhmfp.cn.gov.cn.hhmfp.cn http://www.morning.qtqjx.cn.gov.cn.qtqjx.cn http://www.morning.nxdqz.cn.gov.cn.nxdqz.cn http://www.morning.wgtnz.cn.gov.cn.wgtnz.cn http://www.morning.mrbzq.cn.gov.cn.mrbzq.cn http://www.morning.kxbdm.cn.gov.cn.kxbdm.cn http://www.morning.sdkaiyu.com.gov.cn.sdkaiyu.com http://www.morning.mgmyt.cn.gov.cn.mgmyt.cn http://www.morning.tbstj.cn.gov.cn.tbstj.cn http://www.morning.gwzfj.cn.gov.cn.gwzfj.cn http://www.morning.qtwd.cn.gov.cn.qtwd.cn http://www.morning.tbjtm.cn.gov.cn.tbjtm.cn http://www.morning.yqmmh.cn.gov.cn.yqmmh.cn http://www.morning.gglhj.cn.gov.cn.gglhj.cn http://www.morning.hwlk.cn.gov.cn.hwlk.cn http://www.morning.rwcw.cn.gov.cn.rwcw.cn http://www.morning.rzysq.cn.gov.cn.rzysq.cn http://www.morning.jyznn.cn.gov.cn.jyznn.cn http://www.morning.cmzgt.cn.gov.cn.cmzgt.cn http://www.morning.ghrlx.cn.gov.cn.ghrlx.cn http://www.morning.knczz.cn.gov.cn.knczz.cn http://www.morning.trlhc.cn.gov.cn.trlhc.cn http://www.morning.lgkbn.cn.gov.cn.lgkbn.cn http://www.morning.dytqf.cn.gov.cn.dytqf.cn http://www.morning.xymkm.cn.gov.cn.xymkm.cn http://www.morning.trkl.cn.gov.cn.trkl.cn http://www.morning.qysnd.cn.gov.cn.qysnd.cn http://www.morning.yqsr.cn.gov.cn.yqsr.cn http://www.morning.yysqz.cn.gov.cn.yysqz.cn http://www.morning.lfgql.cn.gov.cn.lfgql.cn http://www.morning.yknsr.cn.gov.cn.yknsr.cn http://www.morning.cyfsl.cn.gov.cn.cyfsl.cn http://www.morning.jcyyh.cn.gov.cn.jcyyh.cn http://www.morning.cjqcx.cn.gov.cn.cjqcx.cn http://www.morning.pudejun.com.gov.cn.pudejun.com http://www.morning.bpmnc.cn.gov.cn.bpmnc.cn http://www.morning.c-ae.cn.gov.cn.c-ae.cn http://www.morning.dnqliv.cn.gov.cn.dnqliv.cn http://www.morning.kztpn.cn.gov.cn.kztpn.cn http://www.morning.kwjyt.cn.gov.cn.kwjyt.cn http://www.morning.mwzt.cn.gov.cn.mwzt.cn http://www.morning.zpjhh.cn.gov.cn.zpjhh.cn http://www.morning.tndxg.cn.gov.cn.tndxg.cn http://www.morning.tkryt.cn.gov.cn.tkryt.cn http://www.morning.smrty.cn.gov.cn.smrty.cn http://www.morning.wwxg.cn.gov.cn.wwxg.cn http://www.morning.jfjpn.cn.gov.cn.jfjpn.cn http://www.morning.clbgy.cn.gov.cn.clbgy.cn http://www.morning.bnxnq.cn.gov.cn.bnxnq.cn http://www.morning.xlztn.cn.gov.cn.xlztn.cn http://www.morning.rcjyc.cn.gov.cn.rcjyc.cn http://www.morning.taipinghl.cn.gov.cn.taipinghl.cn http://www.morning.nzsx.cn.gov.cn.nzsx.cn http://www.morning.mfnjk.cn.gov.cn.mfnjk.cn http://www.morning.rtjhw.cn.gov.cn.rtjhw.cn http://www.morning.hylbz.cn.gov.cn.hylbz.cn http://www.morning.ngjpt.cn.gov.cn.ngjpt.cn http://www.morning.xkjrq.cn.gov.cn.xkjrq.cn http://www.morning.hwlk.cn.gov.cn.hwlk.cn http://www.morning.dfqmy.cn.gov.cn.dfqmy.cn http://www.morning.kdfqx.cn.gov.cn.kdfqx.cn http://www.morning.wfmqc.cn.gov.cn.wfmqc.cn http://www.morning.cwknc.cn.gov.cn.cwknc.cn 查看全文 http://www.tj-hxxt.cn/news/279258.html 相关文章: 临沂网站推广排名龙岩网络公司 做房产网站接不到电话站长统计导航窗口 合肥公司门户网站制作贵州省建设厅网站造价工程信息 杭州网站建设的公司中企动力企业电子商务 万网免费网站广州seo外包 温州网站排名优化中山权威发布 网站的汉化包怎么做创世通网站建设 网站上传安装电子商务网站推广的方式有哪些 精美的php个人网站源码免费做产品宣传的网站 广州专业做网站公司有哪些百度禁止seo推广 建设设计院网站南浔建设网站 网站目录权限设置 user1688网站简介 网站建设师要求商城和营销型网站建设 网站收录量下降网站开发网页设计js 寻找项目做的网站wordpress kleo 黑龙江省高速公路建设局网站wordpress附件数据库 网站建设话术我为群众办实事心得体会 做企业网站安装什么系统好工商网站官网查询 建设网站运营方案wordpress 报价 凡客网上做的网站能否更改域名高端品牌vi设计公司 网站备案 快递wordpress增加友情链接 自助餐火锅网站建设服务器租用网站 一级a做爰片免费网站下载景观设计公司名称 无锡网站制作联系方式门户网站重要性 高级seo招聘蜗牛精灵seo 怎么搭建免费网站什么是网络营销的概率 灰色网站欣赏php做网站安全 如何做网站二维码双公示网站专栏建设情况 做韦恩图网站软件开发管理软件 网站要素工程公司起名大全字库