学习
实践
活动
工具
TVP
写文章

一文搞懂Java中异常机制

本文非常详尽地介绍了Java中异常,几乎360度无死角。 异常概念,分类,使用方法,注意事项和设计等方面全面地介绍了Java异常。 而如果使用异常,那就不必在方法调用处进行检查,因为异常机制将保证能够捕获这个错误,并且,只需在一个地方处理错误,即所谓异常处理程序中。 在这里一定要明确一点:异常代码某种程度错误,尽管Java有异常处理机制,但是我们不能以“正常”眼光来看待异常,异常处理机制原因就是告诉你:这里可能会或者已经产生了错误,您程序出现了不正常情况, 只有在你当前环境下程序无法正常运行下去,也就是说程序已经无法来正确解决问题了,这时它所就会当前环境中跳出,并抛出异常。抛出异常后,它首先会做几件事。 所以如果愿意,我们可以编写代码处理(使用try…catch…finally)这样异常,也可以处理。 对于这些异常,我们应该修正代码,而不是去通过异常处理处理

32320

Java基础10:全面解读Java异常

而如果使用异常,那就不必在方法调用处进行检查,因为异常机制将保证能够捕获这个错误,并且,只需在一个地方处理错误,即所谓异常处理程序中。 在这里一定要明确一点:异常代码某种程度错误,尽管Java有异常处理机制,但是我们不能以“正常”眼光来看待异常,异常处理机制原因就是告诉你:这里可能会或者已经产生了错误,您程序出现了不正常情况, 只有在你当前环境下程序无法正常运行下去,也就是说程序已经无法来正确解决问题了,这时它所就会当前环境中跳出,并抛出异常。抛出异常后,它首先会做几件事。 所以如果愿意,我们可以编写代码处理(使用try…catch…finally)这样异常,也可以处理。 对于这些异常,我们应该修正代码,而不是去通过异常处理处理 。 //那么这里try。。catch就不能处理Son中异常。 //多态就不能实现了。

24220
  • 广告
    关闭

    11.11云上盛惠

    万元礼包限时领取,百款云产品特惠助力上云,云服务器2核2G低至4.2元/月

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Java异常进阶

    ()函数代码中,软件开发人员可能觉得这里不是处理异常FileNotFoundException合适地点,因此他通过throws将该异常再次向上传递。 这样,我们应用就可以通过捕获ApplicationSpecificException来统一处理它们并将最为详尽信息显示给用户,从而通知他因为无法找到偏好文件而使用默认设置: try { startApplication 可以想象得到是,由于getData()可能会被非常频繁地使用,因此软件开发人员需要在每一处调用都使用try … catch …块来截获该异常,从而使代码显得凌乱不堪。 而之所以Checked Exception导致了如此多争论和误用,更多是因为我们在用异常这个用来表示应用中运行错误这个语言组成来通知用户他所必须处理应用无法控制可能情况。 在这里我们再次做一个总结,同时也用来加深一下印象。 API编写者角度来讲,他所需要考虑就是在何时使用一个Checked Exception。

    31940

    碰见异常 你是选就地正法 还是甩锅大法 码思客

    同时使用 Exception和Exception子类在捕获异常时候是冲突,但是子类捕获必须在父类之前,如果第一个catch是Exception,那么他会直接捕获所有异常,不能单独处理其他异常了 因为有一些代码如果写在try中,如果出现异常,那么这些代码是可能不会被执行,如果写在catch中,如果不发生异常也不会执行,所以需要一个地方来写无论是否出现异常都会被执行代码。 ? 无论程序是否发生异常,方法预期返回结果都被改变了,返回不是程序希望得到两个参数商,而是一个与参数无关字符串,所以通常建议在finally中使用return关键字。 抛出异常 什么是抛出异常? 抛出异常就是遇到检查异常,并没有捕获异常直接处理,而是将异常交给调用方处理。 为什么要抛出异常而不是直接捕获? 因为设计上需要。 使用throw可以将代码逻辑补充更加完整,因为某些异常在特定情况是需要根据业务逻辑来判断是否抛出,在特定情况下是可以确定异常,而不是像throws不确定是否会出现异常。

    22740

    try..catch 不能捕获错误有哪些?注意事项又有哪些?

    try块包含我们需要检查代码 关键字throw用于抛出自定义错误 catch处理捕获错误 finally 块是最终结果无论如何,都会执行一个块,可以在这个块里面做一些需要善后事情 1.1 try try块抛出错误后,也会执行finally块 如果没有catch块,错误将不能被优雅地处理,从而导致未捕获错误 1.4 try..catch..finally 建议使用try...catch块和可选 这里还要注意两件事: 在try块中抛出错误后往后代码不会被执行了 即使在try块抛出错误之后,finally块仍然执行 finally块通常用于清理资源或关闭流,如下所示: try { openFile }) .then(res => { // 这里也不会执行,因为错误还没有被处理 console.log(res); }) .catch(err => { ,这些错误 Error 对象继承而来 3.2 EvalError EvalError 表示关于全局eval()函数错误,这个异常不再由 JS 抛出,它存在是为了向后兼容。

    51620

    Java 异常进阶Java异常简介天使变恶魔无处不在throws手足无措API使用者疲于应付API用户正确地使用Checked Exception

    processFile()函数代码中,软件开发人员可能觉得这里不是处理异常FileNotFoundException合适地点,因此他通过throws将该异常再次向上传递。 这样,我们应用就可以通过捕获ApplicationSpecificException来统一处理它们并将最为详尽信息显示给用户,从而通知他因为无法找到偏好文件而使用默认设置: try {      可以想象得到是,由于getData()可能会被非常频繁地使用,因此软件开发人员需要在每一处调用都使用try … catch …块来截获该异常,从而使代码显得凌乱不堪。 而之所以Checked Exception导致了如此多争论和误用,更多是因为我们在用异常这个用来表示应用中运行错误这个语言组成来通知用户他所必须处理应用无法控制可能情况。 在这里我们再次做一个总结,同时也用来加深一下印象。 API编写者角度来讲,他所需要考虑就是在何时使用一个Checked Exception。

    32660

    Java:详解Java中异常(Error与Exception)

    (2)运行时错误因为程序在执行时,运行环境发现了不能执行操作。 (3)逻辑错误因为程序没有按照预期逻辑顺序执行。 ,也可以处理。 2.非运行时异常 (编译异常):是RuntimeException以外异常,类型上都属于Exception类及其子类。程序语法角度讲是必须进行处理异常,如果处理,程序就不能编译通过。 下面的操作是错误因为String 不是Throwable 类子类。 ,catch语句块里没有处理此异常情况:此异常将会抛给JVM处理,finally语句块里语句还是会被执行,但finally语句块后语句不会被执行; 3)当try捕获到异常,catch语句块里有处理此异常情况

    5510

    asyncawait必知必会

    try...catch 最标准(也是我推荐处理方式是使用 try...catch 表达式。当 await 一个函数调用时候,任何 rejected 值都会以异常形式抛出来。 你可以将多个 await 调用包装在一个 try...catch 块中来集中处理所有错误,如果每一步错误处理非必要的话。 这种处理方式有一个缺陷。 由于 try...catch 将会捕获这个代码块中所有异常,一些其他通常不会被 promises 捕获异常也会被捕获住。 这个错误是 console.log() 打印出来不是 JavaScript 自身。 某些时候这将会是致命:如果 BookModel 被一系列函数调用深深地封闭起来了,同时,其中某一个调用将这个错误处理掉了,这时候就很难像这样去发现这个错误了。

    28820

    Try 和异常

    finally 通常会被用来做清理任务。 注意:finally 代码块并不是一定执行,在某些情况下finally块也会执行。 但是这里不会影响程序运行,因为报错代码位于 try 中,try 将这个错误捕获到后,转给了 catchcatch 对这个错误进行了处理。 如果是的话,抛出错误将会传递个能兼容这个异常 catch 代码块中,当 catch 处理完毕后将执行 try…catch 后面的语句,如果存在 finally 代码块,那么将会先执行 finally 如果不是,CLR 会将这个错误向上抛出给 函数调用者,并重复这个过程。 2.抛出抽象异常 抛出抽象异常目的,是因为需要穿越信任边界,防止信息泄露。

    26310

    asyncawait应知应会

    try...catch 最标准(也是我推荐处理方式是使用 try...catch 表达式。当 await 一个函数调用时候,任何 rejected 值都会以异常形式抛出来。 你可以将多个 await 调用包装在一个 try...catch 块中来集中处理所有错误,如果每一步错误处理非必要的话。 这种处理方式有一个缺陷。 由于 try...catch 将会捕获这个代码块中所有异常,一些其他通常不会被 promises 捕获异常也会被捕获住。 这个错误是 console.log() 打印出来不是 JavaScript 自身。 某些时候这将会是致命:如果 BookModel 被一系列函数调用深深地封闭起来了,同时,其中某一个调用将这个错误处理掉了,这时候就很难像这样去发现这个错误了。

    35130

    Java学习笔记——异常处理

    (开发过程中语法错误和逻辑错误不是异常) Java程序在执行过程中所发生异常事件可分为两类: Error: Java虚拟机无法解决严重问题。如:JVM系统内部错误、资源耗尽等严重情况。 一般编写针对性代码进行处理。 Exception: 其它因编程错误或偶然外在因素导致一般性问题,可以使用针对性代码进行处理。 例如: 空指针访问 试图读取不存在文件 网络连接中断 对于这些异常,如果在编写程序时没有进行错误检测以及处理(消息提示等),则会终止程序运行,这是用户希望看到。 对于这类异常,可以不作处理因为这类异常很普遍,若全处理可能会对程序可读性和运行效率产生影响。 catch 如果一个方法内抛该异常对象会被抛出异常,给调用者方法中处理。如果异常没有在调用者方法中处理,它继续被抛给这个调用方法上层方法。这个过程将一直继续下去,直到异常被处理

    9240

    你不知道前端异常处理(万字长文,建议收藏)

    } 这种函数设计方式和抛出异常设计方式功能上说都是一样,只是告诉调用方方式不同。 可以看出,此时已经没有「uncaught Error」啦,仅仅在控制台显示了「标准输出」,而「非错误输出」(因为我用是 console.log,而不是 console.error)。 ,比如网络异常,那么 b 是无法处理,虽然 b catch 住了,但是由于你无法处理,因此一个好做法是继续抛出异常,而不是「吞没」异常。 因为错误抛出时候, 调用栈中包含这个 catch 语句,而仅仅在执行fs.readFile时候才会。 如果栈为空都没有碰到一个 catch,则会抛出「uncaught Error」。需要特别注意是异步异常处理,不过你如果对我讲原理了解了,这都不是事。

    35520

    Java异常处理误区和经验总结

    其实这里错误代码还包含另外一个功能,开发人员亦可以根据错误代码准确知道了发生了什么类型异常。 清单 9 try{ //可能抛出 RuntimeException、IOExeption 或者其它; //注意这里和误区六区别,这里是一段代码抛出多种异常。 (XXXException e){ //如果 B 类 process 方法抛出异常,异常会在 B 类中被打印,在这里会被打印,从而会打印 2 次 logger.error(e) 这就需要开发人员不仅知道自己在做什么,而且要去尽可能知道别人做了什么,可能会导致什么结果,全局去考虑整个应用程序处理过程。这些思想会影响我们对代码编写和处理。 最麻烦问题倒不是引入所有需要这些日志库,问题在于引入这些日志库之间本身兼容。如果在项目初期可能还好解决,可以把所有代码中日志库根据需要重新引入一遍,或者换一套框架。

    19350

    Java 异常处理误区和经验总结

    其实这里错误代码还包含另外一个功能,开发人员亦可以根据错误代码准确知道了发生了什么类型异常。 * 而且这里 catch 处理之后程序继续执行,会导致进一步问题*/ ex.printStacktrace(); } } 可以重构成: 清单 5 public void (XXXException e){ //如果 B 类 process 方法抛出异常,异常会在 B 类中被打印,在这里会被打印,从而会打印 2 次 logger.error( 这就需要开发人员不仅知道自己在做什么,而且要去尽可能知道别人做了什么,可能会导致什么结果,全局去考虑整个应用程序处理过程。这些思想会影响我们对代码编写和处理。 最麻烦问题倒不是引入所有需要这些日志库,问题在于引入这些日志库之间本身兼容。如果在项目初期可能还好解决,可以把所有代码中日志库根据需要重新引入一遍,或者换一套框架。

    80010

    Java 异常处理误区和经验总结

    其实这里错误代码还包含另外一个功能,开发人员亦可以根据错误代码准确知道了发生了什么类型异常。 * 而且这里 catch 处理之后程序继续执行,会导致进一步问题*/ ex.printStacktrace(); } } 可以重构成: 清单 5 public void (XXXException e){ //如果 B 类 process 方法抛出异常,异常会在 B 类中被打印,在这里会被打印,从而会打印 2 次 logger.error(e 这就需要开发人员不仅知道自己在做什么,而且要去尽可能知道别人做了什么,可能会导致什么结果,全局去考虑整个应用程序处理过程。这些思想会影响我们对代码编写和处理。 最麻烦问题倒不是引入所有需要这些日志库,问题在于引入这些日志库之间本身兼容。如果在项目初期可能还好解决,可以把所有代码中日志库根据需要重新引入一遍,或者换一套框架。

    15110

    异常

    多个 catch 关键字后面的程序块,则是针对每个要捕获异常,所准备相应处理程序。 finally 关键字之后程序块,无论是否出现异常,总会被执行。 finally 关键字在 try...catch 机制中并不是必须。 at DefaultException.main(DefaultException.java:11) */ } 抛出异常 在定义一个方法时可以使用 throws 关键字声明,使用 throws 声明方法表示此方法处理异常 Exception:一般指的是程序中出现问题,可以通过 try...catch 处理。 Error:一般指的是JVM错误,程序无法处理。 这是因为所有继承自 RuntimeException 类都可以不使用 try...catch 进行处理。在这种情况下,如果产生异常,将由 JVM 进行处理,此时肯定会中断程序。

    27680

    Java中异常处理详解(try、catch、finally、throw、throws)

    关键字throws运用于方法声明之上,用于表示当前方法处理异常,而是提醒该方法调用者来处理异常(抛出异常). ,会立刻终止程序,所以我们得处理异常: 该方法处理,而是声明抛出,由该方法调用者来处理(throws)。 (e); } finally { System.out.println("不管程序怎样,这里都将会被执行。") 运行时异常被抛出可以处理。即不捕获也声明抛出。 如果finally有return语句,永远返回finally中结果,避免该情况. 如果父类抛出了多个异常,子类重写父类方法时,抛出和父类相同异常或者是父类异常子类或者抛出异常。 父类方法没有抛出异常,子类重写父类该方法时也不可抛出异常。

    1120

    《面试季》经典面试题-异常篇(一)

    前言 大家好,这里是IT学习日记,相信大家对今年IT行情应该也有所了解了,大厂到小厂,各种裁员消息。公司裁员我们无法决定,我们能做就是不断提升自己,提前准备。 1、try关键字:   主要用于包围可能存在异常情况代码段,并不是范围越大越好,如果可能,尽量将包围范围缩小,因为不出异常情况下效率是没有多大影响,但是如果出现异常,那么范围越大则效率越低,因为被try 4、throw关键字:   throw语句用来明确地抛出一个异常,如某个代码段已经会出现某个问题,但是你并不像在这里进行处理,此时可以通过throw关键字进行异常抛出,让调用者去处理。 追问2、try-catch-finally结构中,如果在catch中return了,finally中代码是否还会被执行?    会,finally中代码会在catch结构return之前被执行,但是推荐在catch中做return操作。 小结    积跬步,无以至千里;积小流,无以成江海。

    4210

    JDK1.9-异常处理

    关键字throws运用于方法声明之上,用于表示当前方法处理异常,而是提醒该方法调用者来处理异常(抛出异常). ,会立刻终止程序,所以我们得处理异常: 该方法处理,而是声明抛出,由该方法调用者来处理(throws)。 (e); } finally { System.out.println("不管程序怎样,这里都将会被执行。") 运行时异常被抛出可以处理。即不捕获也声明抛出。 如果finally有return语句,永远返回finally中结果,避免该情况. 如果父类抛出了多个异常,子类重写父类方法时,抛出和父类相同异常或者是父类异常子类或者抛出异常。 父类方法没有抛出异常,子类重写父类该方法时也不可抛出异常。

    24330

    扫码关注腾讯云开发者

    领取腾讯云代金券