日落冬至 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 DB-GPT-HUB Text-to-SQL微调
  • ¥20 求解答(matlab)
  • ¥30 ffmpeg库使用过程中遇到的问题
  • ¥15 pyqt5 中python如何通过Qtwebchannel主动发消息给web前端
  • ¥15 关于HTML中title获取xml内容的问题
  • ¥15 fanuc机器人PRIO083数字信号未复原错误,如何解决?
  • ¥20 如何为现有电路板增加远程控制功能
  • ¥15 C#点击按钮的时候的循环次数就是最后一次,如何是循环第几次的值?
  • ¥15 UE5打包失败,求解决
  • ¥15 请问STM32G431的CANOPEN协议函数怎么写