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

帮忙看看我对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 。这点可以参考阿里开发者规范中异常规约。

    已采纳该答案
    打赏 评论
  • 打赏 评论
  • JonathanYan 2019-09-17 16:12

    异常是为了解耦,把程序遇到的问题和程序分离开,让每一段程序可以专注自己的功能,而不用考虑异常后的处理逻辑,而且标准化了错误处理方法。
    你这种理解一看就是没真正写过代码,尝试用浅显的语言理解这些东西。
    系统抛出的异常就是异常的一种罢了,跟定位没关系,只是用来说明遇到了无法解决的错误罢了。
    像java和python这样的大项目定位源代码错误位置基本没用,定位到了你也改不了,这个和debug不一样。

    打赏 评论

相关推荐 更多相似问题