java 异常 编程

基本信息

摘要:本文倡导一种对异常条件本质的思考方式,并描述一些有助于设计的模式。最后,本文还将在AOP模型中,作为相互渗透的问题,来讨论异常的处理。当你能正确使用异常时,它们会有极大的好处。本文将帮助你做到这一点。

原作者:Barry Ruzek 译者: 易晓斓,原文:http://www.yeeyan.com/articles/view/2091/976

2 为何异常是如此重要

  Java应用中的异常处理在很大程度上揭示了其所基于架构的强度。架构是在应用程序各个层次上所做出并遵循的决定。其中最重要的一个就是决定应用程序中的类,亚系统,或层之间沟通的方式。Java异常是Java方法将另类执行结果交流出去的方式,所以值得在应用架构中给予特殊关注。

  一个衡量Java设计师水平和开发团队纪律性的好方法就是读读他们应用程序里的异常处理代码。首先要注意的是有多少代码用于捕获异常,写进日志文件,决定发生了什么,和在不同的异常间跳转。干净,简捷,关联性强的异常处理通常表明开发团队有着稳定的使用Java异常的方式。当异常处理代码的数量甚至要超过其他代码时,你可以看出团队之间的交流合作有很大的问题(可能在一开始就不存在),每个人都在用他们自己的方式来处理异常。

  对突发异常的处理结果是可以预见的。如果你问问团队成员为什么异常会被抛出,捕获,或在特定的一处代码里忽视了异常的发生,他们的回答通常是,“我没有别的可做”。如果你问当他们编写的异常真的发生了会怎么样,他们会皱皱眉,你得到的回答类似于这样,“我不知道。我们从没测试过。”

  你可以从客户端的代码判断一个java的组件是否有效利用了java的异常。如果它们包含着大堆的逻辑去弄清楚在何时一笔操作失败了,为何失败,是否有弥补的余地,那么原因很有可能要归咎于组件的报错设计。错误的报错系统会在客户端产生大量的“记录然后忘掉”的代码,这些代码鲜有用途。最差的是弄拧的逻辑,嵌套的try/catch/finally代码块,和一些其他的混乱而导致脆弱而难于管理的应用程序。

  事后再来解决Java异常的问题,或根本就不解决,是软件项目产生混乱并导致滞后的主要原因。异常处理是一个在设计的各个部分都急需解决的问题。对异常处理建立一个架构性的约定是项目中首要做出的决定。合理使用Java异常模型对确保你的应用简单,易维护,和正确有着长远的影响。

3 解析异常

  正确使用Java异常模型所包含的内容一直以来有着很大的争议。Java不是第一种支持异常算法语义的;但是,它却是第一种通过编译器来执行声明和处理某些异常的规则的语言。许多人都认为编译时的异常检查对精确的软件设计颇有帮助。图1显示的Java异常的等级。


图1:Java异常的等级

  通常,Java编译器强迫抛出基于java.lang.Throwable的异常的方法要在它声明中的“throws”部分加上那个异常。而且,编译器还会证实客户端的方法或者捕获已声明的异常,或者特别声明自己也抛出同样的异常。这些简单的规则对世界范围的Java程序员都有深远的影响。

  编译器放松了对Throwable继承树中两个分支的异常检查。java.long.Error和java.lang.RuntimeException 的子类免于编译时的检查。在这两类中,软件工程师通常对运行中异常更感兴趣。“不检查”的异常指的是这一组,以便和所有其它“检查”的异常区别开。

  我可以想象那些接受“检查”的异常的人,也会很看重Java的数据类型。毕竟,编译器对数据类型施加的限制鼓励严格的编码和精确的思维。编译时的类型检查对减少运行时的严重问题有帮助。编译时的异常检查也能起到类似的作用,它会提醒开发人员某个方法可能会有预想不到的结果需要处理好。

  早期的建议是尽可能的使用“检察的异常”,以此来最大限度的利用编译器提供的帮助来写出无错误的软件。Java类库API的设计者们都认同这一点,他们广泛地使用“检察的异常”来模拟类库方法中几乎所有的紧急应变措施。在J2SE5.1 API规格中,“检察的异常”类型已2比1的比率超过了“未检查的异常”类型。

  对程序员而言,看上去在Java类库中大多数的常用方法对每一个可能的失败都声明了“检察的异常”。例如,java.io包
对IOException这个“检察的异常”就有着很大的依赖。至少有63个Java类库包,或直接,或通过十几个下面的子类,抛出这个异常。

  I/O的失败极其稀有,但是却很严重。而且,一旦发生,从你所写的代码里基本上是无法补救的。Java程序员意识到他们不得不提供IOException 或类似的不可补救的事件,而一个简单的Java类库方法的调用就可能让这些事件发生。捕获这些异常给本来简单的代码带来了一定的晦涩,因为即使在捕获的代码块里也基本上帮不上忙。但是不加以捕获又可能更糟糕,因为编译器要求你的方法必须要抛出那些异常。这样你的实施细则就不得不暴露在外了,而通常好的面向对象的设计都是要隐藏细节的。

  这样一个不可能赢的局面导致了我们今天所警告的绝大多数臭名卓著的异常处理的颠覆性格局。同时也衍生了很多正确或错误的补救之道。

  一些Java界的知名人物开始质疑Java的“检察的异常”的模型是否是一个失败的试验。有一些东西肯定是失败的,但是这和在Java语言里加入对异常的检查是毫无关联的。失败是由于在Java API的设计者们的思维里,大多数失败的情形是雷同的,所以可以通过同一种异常传达出去。

4 故障和应变

  让我们来考虑在一个假想的银行应用中的CheckingAccount类。一个CheckingAcccount属于一个用户,记载着用户的存款余额,也能接受存款,接受止兑的通知,和处理汇入的支票。一个CheckingAcccount对象必须协调同步线程的访问,因为任何一个线程都可能改变它的状态。CheckingAcccount类里processCheck的方法会接受一个Check对象为参数,通常从帐户余额里减去支票的金额。但是一个管理支票清算的用户端程序调用processCheck方法时,必须有两种可能的应变措施。一,CheckingAccount对象里可能对该支票已有一个止付的命令;二,帐户的余额可能不足已满足支票的金额。

  所以,processCheck的方法对来自客户端的调用可以有3种方式回应。正常的是处理好支票,并把方法签名里声明的结果返回给调用方。两种应变的回应则是需要与支票清算端沟通的在银行领域实实在在存在的情况。processCheck方法所有3种返回结果都是按照典型的银行支票帐户的行为而精心设计的。

  在Java里,一个自然的方法来表示上述紧急的应变是定义两种异常,比如StopPaymentException(止付异常)和 InsufficientFundsException(余额不足异常)。一个客户端如果忽略这些异常是不对的,因为这些异常在正常操作的情况下一定会被抛出。他们如同方法的签名一样反映了方法的全面行为。

  客户端可以很容易的处理好这两种异常。如果对支票的兑付被停止了,客户端把该支票交付特别处理。如果是因为资金不足,用户端可以从用户的储蓄帐户里转移一些资金到支票帐户里,然后再试一次。

  在使用CheckingAccount的API时,这些应变都是可以预计的和自然的结果。他们并不是意味着软件或运行环境的失败。这些异常和由于CheckingAccount类中一些内部实施细则引起的真正失败是不同的。

  设想CheckingAccount对象在数据库里保持着一个恒定的状态,并使用JDBC API来对之访问。在那个API里,几乎所有的数据库访问方法都有可能因为和CheckingAccount实施无关的原因而失败。比如,有人可能忘了把数据库服务器运行起来,一个未有连上的网络数据线,访问数据库的密码改变了,等等。

  JDBC依靠一种“检查的异常”,SQLException,来汇报任何可能的错误。可能出错的绝大多数原由都是数据库的配置,连接,或其所在的硬件设施。对processCheck方法而言,它对上述错误是无计可施的。这不应该,因为processCheck至少了解它自己的实施细则。在调用栈里上游的方法能处理这些问题的可能就更小。

  CheckingAccount这个例子说明了一个方法不能成功返回它想要的结果的两个基本原因。这里是两个描述性的术语:

应变
与实际预料相符,一个方法给出另外一种回应,而这种回应可以表达成该方法所要达到的目的之一。这个方法的调用者预料到这个情况的出现,并有相对的应付之道。

故障
在未经计划的情况下,一个方法不能达到它的初衷,这是一个不诉诸该方法的实施细则就很难搞清的情况。
应用这些术语,对processCheck方法而言,一个止付的命令和一个超额的提取是两种可能的应变。而SQLException反映了可能的故障。processCheck方法的调用者应该能够提供应变,但却不一定能有效的处理好可能发生的故障。

Java异常的匹配
在建立应用架构中Java异常的规则时,以应变和故障的方式仔细考虑好“什么可能会出错”是有长远意义的。


  应变情况恰如其分地匹配给了Java检查的异常。因为它们是方法的语义算法合同中不可缺少的一部分,在这里借助于编译器的帮助来确保它们得到解决是很有道理的。如果你发现编译器坚持应变的异常必须要处理或者在不方便的时候必须要声明会给你带来些麻烦,你在设计上几乎肯定要做些重构了。这其实是件好事。

  出现故障的情况对开发人员而言是蛮有意思的,但对软件逻辑而言却并非如此。那些软件”消化问题“的专家们需要关于故障的信息以便来解决问题。因此,未检查的异常是表示故障的很好方式。他们让故障的通知原封不动地从调用栈上所有的方法滤过,到达一个专门来捕获它们的地方,并得到它们自身包含的有利于诊断的信息,对整个事件提供一个有节制的优雅的结论。产生故障的方法不需要来声明(异常),上游的调用方法不需要捕获它们,方法的实施细则被正确的隐藏起来- 以最低的代码复杂度。

  新一些的Java API,比如像Spring架构和Java Data Ojects类库对检查的异常几乎没有依赖。Hibernate ORM架构在3.0版本里重新定义了一些关键功能来去除对检查的异常的使用。这就意味着在这些架构举报的绝大部分异常都是不可恢复的,归咎于错误的方法调用代码,或是类似于数据库服务器之类的底层部件的失败。特别的,强迫一个调用方来捕获或声明这些异常几乎没有任何好处。
设计里的故障处理

  在你的计划里,承认你需要去做就迈好了有效处理好故障的第一步。对那些坚信自己能写出无懈可击的软件的工程师们来说,承认这一点是不容易的。这里是一些有帮助的思考方式。首先,如果错误俯拾即是,应用的开发时间将很长,当然前提是程序员自己的bug自己修理。第二,在Java类库中,过度使用检查的异常来处理故障情形将迫使你的代码要应对好故障,即使你的调用次序完全正确。如果没有一个故障处理的架构,凑合的异常处理将导致应用中的信息丢失。

一个成功的故障处理架构一定要达到下面的目标:
• 减少代码的复杂性
• 捕获和保存诊断性信息
• 对合适的人提醒注意
• 优雅地退出行动

  故障是应用的真实意图的干扰。因此,用来处理它们的代码应尽量的少,理想上,把它们和应用的语义算法部分隔离开。故障的处理必须满足那些负责改正它们的人的需要。开发人员需要知道故障发生了,并得到能帮助他们搞清为何发生的信息。即使一个故障,在定义上而言,是不可补救的,好的故障处理会试着优雅地结束引起故障的活动。


对故障情况使用未检查的异常

  在做框架上的决定时,用未检查的异常来代表故障情况是有很多原因的。Java的运行环境对代码的错误会抛出“运行时异常”的子类,比如, ArithmeticException或ClassCastException。这为你的框架设了一个先例。未检查的异常让上游的调用方法不需要为和它们目的不相关的情况而添加代码,从而减少了混乱。

  你的故障处理策略应该认识到Java类库的方法和其他API可能会使用检查的异常来代表对你的应用而言只可能是故障的情况。在这种情形下,采用设计约定来捕获API异常,将其以故障来看待,抛出一个未检查的异常来指示故障的情况和捕获诊断的信息。

  在这种情况下抛出的特定异常类型应该由你的框架来定义。不要忘记一个故障异常的主要目的是传递记录下来的诊断信息,以便让人们来想出出错的原因。使用多个故障异常类型可能有些过,因为你的架构对它们都一视同仁。多数情况下,一条好的,描述性强的信息将单一的故障类型嵌入就够用了。使用Java基本的 RuntimeException来代表故障情况是很容易的。截止到Java1.4,RuntimeException,和其他的抛出类型一样,都支持异常的嵌套,这样你就可以捕获和报出导向故障的检查的异常。

  你也许会为了故障报告的目的而定义你自己的未检查的异常。这样做可能是必要的,如果你使用Java1.3或更早的版本,它们都不支持异常的嵌套。实施一个类似的嵌套功能来捕获和转换你应用中构成故障的检查的异常是很简单的。你的应用在报错时可能需要一个特殊的行为。这可能是你在架构中创建 RuntimeException子类的另一个原因。

建立一个故障的屏障

  对你的故障处理架构而言,决定抛出什么样的异常,何时抛出是重要的决定。同样重要的是,何时来捕获一个故障异常,之后再怎么办。这里的目的是让你应用中的功能性部分不需要处理故障。把问题分开来处理通常都是一件好事情,有一个中央故障处理机制长远来看是很有裨益的。

  在故障屏障的模式里,任何应用组件都可以抛出故障异常,但是只有作为“故障屏障”的组件才捕获异常。采用此种模式去除了大多数程序员为了在本地处理故障而插入的复杂的代码。故障屏障逻辑上位于调用栈的上层,这样在一个默认的行动被激发前,一个异常向上举报的行为就被阻止了。根据不同的应用类型,默认的行动所指也不同。对一个独立的Java应用而言,这个行动指活着的线程被停止。对一个位于应用服务器上的Web应用而言,这个行动指应用服务器向浏览器送出不友好的(甚至令人尴尬的)回应。

  一个故障屏障组件的第一要务就是记录下故障异常中包含的信息以为将来所用。到现在为止,一个应用日志是做成此事的首选。异常的嵌套的信息,栈日志,等等,都是对诊断有价值的信息。传递故障信息最差的地方是通过用户界面。把应用的使用者卷进查错的进程对你,对你的用户而言都不好。如果你真的很想把诊断信息放上用户界面,那可能意味着你的日志策略需要改进。

  故障屏障的下一个要务是以一种可控的方式来结束操作。这具体的意义要取决于你应用的设计,但通常包括产生一个可通用的回应给可能正在等待的客户端。如果你的应用是一个Web service,这就意味着在回应中用soap:Server的<faultcode>和通用的失败信息< faultstring>来建立一个SOAP故障元素<fault>。如果你的应用于浏览器交流,这个屏障就会安排好一个通用的 HTML回应来表明需求是不能被处理的。

  在一个Struts的应用里,你的故障屏障会以一种全局异常处理器的形式出现,并被配置成处理RuntimeException的任何子类。你的故障屏障类将延伸org.apache.struts.action.ExceptionHandler类,必要的话,重写它的方法来实施用户自己的特别处理。这样就会处理好不小心产生的故障情况和在处理一个Struts动作时发现的故障。图2显示的就是应变和故障异常。


图2 应变和故障异常

  如果你使用的是Spring MVC架构,你可以继承SimpleMappingExceptionResolver类,并配置成处理RuntimeException和它的子类们,这样很容易的就建起了故障屏障。通过重写resolveException的方法,你可以在使用父类的方法来把需求导引到一个发出通用错误提示的view 组件之前,加入你需要的用户化的处理。

  当你的架构包含了故障屏障,程序员都知晓了后,再写出一次性的故障异常的冲动就会锐减。结果就是应用中出现更干净,更易于维护的代码。

5 架构中应变的处理

  将故障处理交与屏障后,主要组件间的应变交流变得容易多了。一个应变代表着与主要返回结果同等重要的另外一种方法结果。因此,检查的异常类型是一个能够很好地传递应变情况的存在并提供必要的信息来与它竞争的工具。这个方式借助于Java编译器的帮助来提醒程序员关于他们所用的API的方方面面以及提供全套的方法输出的必要性。

  仅仅使用方法的返回值类型来传递简单的应变是可能的。比如,返回一个空引用,而不是一个具体的对象,可以意味着对象由于一个已定义的原因不能被建立。 Java I/O的方法通常返回一个整数值-1,而不是字节的值或字节的数来表示文件的结尾。如果你的方法的语义简单到可以允许的地步,另一种返回值的方法是可以使用的,因为它摒弃了异常带来的额外的花销。不足之处是方法的调用方要检测一下返回的值来判断是主要结果,还是应变结果。但是,编译器没有办法来保证方法调用者会使用这个判断。

  如果一个方法有一个void的返回类型,异常是唯一的方法来表示应变发生了。如果一个方法返回的是一个对象的引用,那么返回值只可能是空或非空(null and non-null)。如果一个方法返回一个整数型,选择与主要返回值不冲突的,可以表示多种应变情况的数值是可能的。但是这样的话,我们就进入了错误代码检查的世界,而这正式Java异常模式所着力避免的。
提供一些有用的信息

  定义不同的故障报告的异常类型是没什么道理的,因为故障屏障对所有异常类型一视同仁。应变异常就有很大的不同,因为它们的原意是要向方法调用者传递各种情况。你的架构可能会指出这些异常应该继承java.lang.Exception或一个指定的基类。

  不要忘记你的异常应该是百分百的Java类型,你可以用它来存放为你的特殊目的服务的特殊字段,方法,甚至是构造器。比如,被假想的 processCheck()方法抛出的InsufficientFundsException这个异常类型就应该包含着一个 OverdraftProtection的对象,它能够从另外一个帐户里把短缺的资金转过来。

日志还是不要日志

  记录下故障异常是有用处的,因为日志的目的是在一些需要改正的情况下,日志可以吸引人们的注意力。但对应变异常而言却并非如此。应变异常可能代表的只是极少数情况,但是在你的应用里,每一个情况还是会发生的。它们意味着你的应用正在如最初的设计般正常工作着。经常把日志代码加进应变的捕获块里会使你的代码晦涩难懂,而又没有实际的好处。如果一个应变代表了一重要的事件,在抛出一个异常应变来警醒调用者之前,产生一笔日志,记录下这个事件可能会让这个方法更好些。

6 异常的各个方面

  在Aspect Oriented Programming(AOP)的术语里,故障和应变的处理是互相渗透的问题。比如,要实施故障屏障的模式,所有参与的类必须遵循通用规格:

• 故障屏障方法必须存活在遍历参与类的方法调用图的最前端
• 参与类必须使用未检查的异常来表示故障情况
• 参与类必须使用故障屏障期望得到的有针对性的未检查的异常类型
• 参与类必须捕获并从低端方法中把在执行情境下注定的故障转换成检查的异常
• 参与类不能干扰故障异常被传递到故障屏障的过程

  这些问题超越了那些本不相干的类的边界。结果就是少数零散的故障处理代码,以及屏障类和参与类间暗含的耦合(这已经比不使用模式进步多了!)。AOP让故障处理的问题被封装在通用的可以作用到参与类的层面上。如AspectJ和Spring AOP这样的Java AOP架构认为异常的处理是添加故障处理行为的切入点。这样,把参与者绑定在故障屏障的模式可以放松些。故障的处理可以存活在一个独立的,不相干的方面里,从而摒弃了屏障方法需要放在方法激活次序的最前头的要求。

  如果在你的架构里利用了AOP,故障和应变的处理是理想的在应用里用到的在方面上的候选。对故障和应变的处理在AOP架构下的使用做一个完整的勘探将是将来论文里一个很有意思的题目。

7 结论

  虽然Java异常模型自它出现以来就激发了热烈的讨论,如果使用正确的话,它的价值还是很大的。作为一个设计师,你的任务是建立好规格来最大限度地利用好这个模型。以故障和应变的方式来考量异常可以帮助你做出正确的决定。合理使用好Java异常模型可以让你的应用简单,易维护,和正确。AOP技术将故障和应变定位为相互渗透的问题,这个方法可能会对你的架构提供一些帮助。

8 引用

• Sun's Exception Tutorial Java异常的基本知识
• Does Java Need Checked Exception? Bruce Eckel对Java中检查的异常的异议
• Exceptional Java 关于异常的很好的讨论,有架构式的异常规则来模仿
• The Exceptions Debate 来自于developerWorks的关于异常的来龙去脉
• The Apache Struts Web Application Framework Struts的信息源
• The Spring Framework Spring框架的信息源
• Wikipedia: Aspect Oriented Programming 一个很好的对AOP概念的介绍
• The AspectJ Project AspectJ的信息源
ChangeMamba训练调试 此仓库的代码是在 Linux 系统下运行的。我们尚未测试是否能在其他操作系统下运行。 首先需要安装VMama仓库。以下安装顺序取自VMama仓库。克隆该版本库并导航至项目目录: 建议设置 conda 环境并通过 pip 安装依赖项。使用以下命令设置环境: 创建并激活新的 conda 环境 安装依赖项 检测和分割任务的依赖库(在 VMamba 中为可选项) 二、下载预训练权重 另外,请下载VMamba-Tiny, VMamba-Small, and VMamba-Base在ImageNet上的预训练权重并把它 阅读详情

相关推荐

单相全桥逆变器中比例谐振(PR)控制的优化设计与实现

本文深入探讨了比例谐振(PR)控制在单相全桥逆变器中的优化设计与实现。通过对比PID控制,详细阐述了PR控制在50Hz基波频率处实现无静差跟踪和强抗干扰性的原理。文章提供了从理论建模、参数整定(Kp, Kr, ωc)到仿真验证的完整实战流程,并介绍了准比例谐振(QPR)控制以增强频率鲁棒性,以及多谐振点设计以抑制特定谐波等进阶优化方法,最终实现THD从3%降至1%以内的显著性能提升。

weixin_29056781的博客 176

高效的java异常处理

1 基本信息摘要:本文倡导一种对异常条件本质的思考方式,并描述一些有助于设计的模式。最后,本文还将在AOP模型中,作为相互渗透的问题,来讨论异常的处理。当你能正确使用异常时,它们会有极大的好处。本文将帮助你做到这一点。原作者:Barry Ruzek   译者: 易晓斓,原文:http://www.yeeyan.com/articles/view/2091/9762 为何异常是如此重要

elimago的专栏 887

手把手教你用MSPM0G3507和TB6612驱动MG513X电机(附完整代码与PID调速)

本文详细介绍了如何使用MSPM0G3507微控制器和TB6612驱动模块控制MG513X电机,包括硬件连接、软件配置、编码器测速和PID调速等关键步骤。通过完整的代码示例和PID算法实现,帮助开发者快速掌握电机驱动技术,适用于智能小车、机械臂等嵌入式项目。

weixin_30254435的博客 341

1.1(Java高级特性)异常处理

**扯淡:**大家好,欢迎大家观看这篇文章,我是一个java的初学者。准备在22年2月7号之后找工作了,现在做一个70天大冲刺笔记。从java高级特性到微服务架构的整体笔记(也算是我走的路线了)。从今天开始要做个自律啦(希望大家喜欢)欢迎大家一起讨论学习,我是初学者瑟瑟发抖 这里我所有的笔记都是来源于网上视频:尚硅谷,黑马等这两个地址视频非常牛逼 硅谷 https://www.bilibili.com/read/cv5216534?spm_id_from=333.999.0.0 黑马 https://www

weixin_46401545的博客 973

WorkBuddy任务对话上下文管理:Token、compact与上下文窗口实战指南

在大语言模型应用中,Token作为文本处理的最小单位,直接决定上下文窗口的消耗速度,而上下文窗口则限定了单次对话可承载的信息总量。当对话超出窗口限制时,compact压缩机制会触发有损摘要,导致关键约束丢失或工具调用结果被稀释。合理管理上下文不仅能提升多步骤任务的稳定性,还能显著降低Token成本与响应延迟。在文档处理、代码开发、多步自动化等场景中,通过主动压缩、状态外置、分段喂入等策略,可有效避免任务后期遗忘、版本混乱等问题。本文围绕WorkBuddy的上下文管理机制,从Token与compact的底层原

weixin_29055699的博客 395

Verilog-asm小练习—PLL建模

Verilog- ams是Verilog标准的模拟混合信号语言,以下是对PLL建模的一种思路参考

weixin_44700185的博客 1017

Spring学习笔记26

Spring-WS集成(续)5.处理端点异常事情不会一帆风顺。传输的消息有可能不能转化成Java对象或消息根本就不是合法的XML,因此服务端点就有可能抛出一个异常——我们应该怎么处理它呢?如果处理消息时出现异常,我们需要向客户返回一个SOAP错误。不过,SOAP并不识别Java异常,而基于SOAP的web service通常都使用SOAP错误来表明失败。所以,我们需要将由web ser

amethystic 1848

在MCUXpresso上通过J-link烧写KW45

背景: KW45B是nxp 的ble npi产品,其使用的IDE为MCUXpressso或者IAR,MCUXpressso有一些bug,但是由于MCUXpressso阅读查找代码相对IAR容易,所以我经常使用的MCUXpressso进行开发。当然IAR也有其优势,比如编译、烧写速度相对MCUXpressso更快,是比较通用的一个平台,而MCUXpressso是NXP独有的。 Kw45有两种烧写方式,一是使用MCUlink,二是使用Jlink。NXP ble 产品线提供的IDE资料里有最新的15.0版本的

weixin_41889258的博客 2859

【Java基础篇】Java异常篇

java异常篇Java 异常处理Exception 类的层次Java 内置异常类异常方法捕获异常throws/throw 关键字finally关键字声明自定义异常通用异常final、 finally、 finalize 的区别? Java 异常处理 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。 比如说,你的代码少了一个分号,那么运行出来结果是提示是错误java.lang.Error;如果你用System.out.println(11/0),那么你是因为你用0做了除数,会抛

输入技术、输出想法 2140

(01)ORB-SLAM2源码无死角解析-(38) EPnP 算法原理详解→理论基础二:分情况求得beta初始解

讲解关于slam一系列文章汇总链接:史上最全slam从零开始,针对于本栏目讲解的(01)ORB-SLAM2源码无死角解析链接如下(本文内容来自计算机视觉life ORB-SLAM2 课程课件): (01)ORB-SLAM2源码无死角解析-(00)目录_最新无死角讲解:https://blog.youkuaiyun.com/weixin_43013761/article/details/123092196 文末正下方中心提供了本人联系方式,点击本人照片即可显示WX→官方认证{\color{blue}{文末正下方中心}

江南才尽江南山,年少无知年少狂! 1025

【电机驱动与运动控制】期末重点问题集合

问题1 梯形曲线和S形曲线各自的特点和区别,比较梯形和S形曲线位置、速度、加速度、加加速度的区别。 问题2 总惯量的计算包含哪几个部分? 哪几个部分需要进行折算? 在齿轮箱的输出侧(2号轴)总惯量需要折算到齿轮箱的输入侧(1号轴) 为什么需要折算? 齿轮箱比的存在使2号轴的转速和电机的转速不同 问题3 指出每个部分的名称。 每个部分的功能。 主磁极的励磁绕组:绝大部分直流电机都是由励磁绕组通以直流电建立主磁场; - 电枢铁心:在两个主磁极内表面之间,由硅钢片叠成的圆

【人工智障 | 计算鸡视觉 | 机器孩】 5705

java中异常的概念及异常体系划分

Java中异常的概念及异常体系划分

wgx_0504的博客 776

宇瞳杯安防镜头设计

宇瞳杯安防镜头设计

weixin_72050316的博客 1517

Java编程中常见异常有哪些?

Java编程中常见异常有哪些? 【导语】在进行Java编程的过程中,我们需要通过代码编写进行程序的运行,都是人工进行代码编写,所以会出现不少异常现象,这都是属于正常现象,但是遇到这些异常现象是需要大家了解并学会处理的,今天就先给大家介绍一下Java编程中常见异常有哪些?一起来看看吧。 Java中常见的异常: 1、空指针异常类:NullPointerException 2、数据类型转换异常:java.lang.ClassCastException 3、没有访问权限:java.lang.IllegalAcces

qq_38397646的博客 3931

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Java 编程中关于异常处理的 10 个最佳实践

异常处理在编写健壮的Java应用的过程中,扮演着一个重要的角色。它并不是应用的功能需求,且需要优雅的处理任何错误情况,例如资源不可用,错误的输入,null输入等等。Java提供几个异常处理功能,并通过try, catch 和 finally关键字内嵌在语言的本身。Java编程语言同样允许创建新的异常和使用 throw 和 throws 抛出该异常。在实践中,异常处理不单单是知道语法这么简单。编写

来啊 快活啊 986

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

15.java基础---异常编程题

知识点 1、程序中异常产生后,是如何处理的 1. 程序中发生异常后,会停止程序向下执行 2. 检查当前异常发生位置是否异常处理机制 有异常处理: 直接处理异常 没有异常处理:抛出给调用者 3. 如果程序中没有异常处理机制,异常会一直抛出到JVM 4. JVM收到异常后,打印异常信息,终止JVM运行 2、Java的异常可以分为哪两类,分别有什么特点,并举例已经接触过的异常类 Java的异常类分为: 1、编译时异常:在编译阶段需要检查是否有异常存在,一旦有异常需要预先的处理。否则程序会报

weixin_44140163的博客 2418

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Java编程之异常处理

写在前面:Java基础系列文章 Java基础要点笔记1(尚硅谷) Java基础要点笔记2面向对象(尚硅谷) 十大排序算法 关于设计模式 Java基础写在前面:Java基础系列文章一、异常概述与异常体系结构二、异常处理方式2.1 try-catch-finally2.2 throws + 异常类型 一、异常概述与异常体系结构 java程序在执行过程中所发生的异常事件可分为两类: Error: Java虚拟机无法解决的严重问题。如JVM系统内部错误、资源耗尽等严重情况,比如StackOverflowError

weixin_44508223的博客 665

Java程序设计 异常 编程题

6-1 jmu-Java-06异常-finally (8分) 代码中向系统申请资源,到最后都要将资源释放。 现有一Resource类代表资源类,包含方法: open(String str)打开资源,声明为抛出Exception(包含出错信息)。 close()方法释放资源,声明为抛出RuntimeException(包含出错信息) 现在根据open(String str)中str的不同,打印不同的信息。str的内容分为4种情况: fail fail,代表open和close均会出现异常。打印open的

努力学习的小菜同学 3631

Java异常及网络编程

当一个方法中使用throw抛出一个非RuntimeException的异常时,就要在该方法上使用throws声明这个异常的抛出。此时调用该方法的代码就必须处理这个异常,否则编译不通过。​/*** 测试异常的抛出*/​return age;​/*** 当一个方法使用throws声明异常抛出时,调用此方法的代码片段就必须处理这个异常*///使用throw对外抛出一个异常// throw new RuntimeException("年龄不合法!");

是程序喵呀 1060

Java中的数字异常类型_Java编程中常见异常有哪些?

【导语】在进行Java编程的过程中,我们需要通过代码编写进行程序的运行,都是人工进行代码编写,所以会出现不少异常现象,这都是属于正常现象,但是遇到这些异常现象是需要大家了解并学会处理的,今天就先给大家介绍一下Java编程中常见异常有哪些?一起来看看吧。Java中常见的异常:1、空指针异常类:NullPointerException2、数据类型转换异常:java.lang.ClassCastExce...

weixin_28235513的博客 675

Java编程中关于异常处理的10个最佳实践

在实践中,异常处理不单单是知道语法这么简单。编写健壮的代码是更像是一门艺术,在本文中,将讨论Java异常处理最佳实践。这些Java最佳实践遵循标准的JDK库,和几个处理错误和异常的开源代码。这还是一个提供给java程序员编写健壮代码的便利手册。Java 编程中异常处理的最佳实践 这里是我收集的10个Java编程中进行异常处理的10最佳实践。在Java编程中对于检查异常有褒有贬,强制处理异

liuyanxue0408的博客 351

Java异常以及网络编程

Java异常 异常处理: try catch finally throw throws throw异常://指定方法中抛出指定的异常 throw new *Exception(‘异常产生原因’); 注意: 1.throw关键字必须写在方法的内部 2.throw关键字后面new的对象必须是Exception或者是Exception的子类 3.throw关键字抛出指定的异常对象,我们就必须处理这个异常对象 throw关键字后面创建的是runtimeexception或者是runtimeexception的子类对

每天至少八杯水的博客 141

java---Socket编程出现的异常种类

java---Socket编程出现的异常种类

p15097962069的博客 156

Java编程中10个最佳的异常处理技

[嵌牛导读] :在实践中,异常处理不单单是知道语法这么简单。编写健壮的代码是更像是一门艺术,在本文中,将讨论Java异常处理最佳实践。这些Java最佳实践遵循标准的JDK库,和几个处理错误和异常的开源代码。这里是我收集的10个Java编程中进行异常处理的10最佳实践。在Java编程中对于检查异常有褒有贬,强制处理异常是一门语言的功能。 [嵌牛鼻子] :为可恢复的错误使用检查型异常,为编程错误使用...

游戏建模零基础入门教程 1276

java 到异常_java编程中遇到的异常以及异常的一些处理

n 异常的概念程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常。异常发生时,是任程序自生自灭,立刻退出终止,还是输出错误给用户?比如除法运算、读写文件操作,都可能发生异常。(当除数为0时;文件路径不存在时)。该如何处理?C语言的风格:用函数返回值作为执行状态。比如返回一个为0的值表示文件不存在这个状态。缺点是代码比较散乱。而Java语言提供了一种优秀的解决办法:异...

weixin_39539807的博客 254

Java编程中常见的异常以及数据库相关的异常

这些只是一些常见的异常类型,实际开发中可能会遇到其他特定于应用程序和框架的异常。处理异常是编写健壮和可靠代码的重要部分,可以使用try-catch语句来捕获和处理异常,以确保程序能够优雅地处理异常情况。

qq_46130027的博客 1176
下一篇: spring 异常 事务
kakarot_java
博客等级 码龄19年 0粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值