日落冬至 2019-09-17 15:50 采纳率: 0%
浏览 216
已采纳

帮忙看看我对java异常的理解对不对

对于java的异常,我的理解是异常是程序出现的错误导致程序无法继续运行下去。
受查异常并不是程序的错误,是环境的问题,比如说打开一个文件,第一次打开文件成功了没问题,然后我把文件删了,第二次再打开,就出错/异常了,所以它并不是程序的错,而是环境的问题。
异常是不可避免的,也是不可令其变为正常的,文件不存在,程序无法做到让它存在。所以异常不能改为正常,但是又不能继续运行下去,所以要进行特殊处理。
这个特殊处理是什么,要看具体实际情况,谁来处理才是重点。出现异常的方法能够自己进行特殊处理吗?不一定。因为很多时候出现异常的方法是其它方法调用的。为了方便我描述,在这里我举个例子。A方法调用了B方法,B方法调用了C方法,C方法出现异常了。这个时候C不能进行特殊处理,因为这个情况下C的异常不仅仅影响到C自己,还影响到了AB。比如说A需要一瓶奶茶和一瓶柠檬茶,A方法调用B方法去获得,B方法调用C方法去某个具体地方买然后返回给A方法。C方法去买,但是发现奶茶全世界禁止买卖奶茶。C出现了异常,C能采取特殊处理吗?无论它怎么处理都不能完成他的工作,所以它不能处理,只能将这个问题反馈给B,同时B受到了影响,B也不能通过其它途径买奶茶所以B同样不能特殊处理,同理B不能完成工作所以将问题反馈给A。同时A受到了影响,不过A能够特殊处理,A决定不要奶茶和柠檬茶了,选用另一个方案:白开水加冰。这里可以看出异常处理机制的好处,出异常了不是直接结束掉整个程序而是确定了出现某个异常时,选择另一个方案。C反馈给B也就是将异常抛给B,B再抛给A,A捕捉到后进行特殊处理。
猜想:系统是会自动抛出异常的,那么为什么还要写throws呢?我猜是为了定位。代码可能有几个地方都有可能出现异常,如果写了throws,然后再catch,那就定位了异常。因为不同地方的异常都要不同处理。所以要确定位置。
个人理解和猜想,希望各位大牛帮忙看看对不对。

  • 写回答

3条回答 默认 最新

  • 毕小宝 博客专家认证 2019-09-18 08:55
    关注

    是的,程序中所有的异常,如果代码中不按照业务流程处理异常,是会上升到 JVM 层,JVM 的 Thread 类维护了一个 UncaughtExceptionHandler,它的 uncaughtException() 方法进行处理。默认情况下,线程的 UncaughtExceptionHandler 是其所属的 ThreadGoup 实例,它的定义是就是打印堆栈日志。

    当然这类异常是运行时异常,JVM 不强制要求处理,也不会导致程序崩溃或退出。另一类受检查异常是必须要求程序处理的,用 throws 往上层抛出,直到业务顶层去处理,直到 main 层再抛给 JVM 进入 UncaughtExceptionHandler,这时就可能影响程序正常运行了。

    结论:异常抛出或者处理,是根据程序业务决定的,一般到了最顶层就必须处理,而不能上升给 JVM 。这点可以参考阿里开发者规范中异常规约。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题