日落冬至 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 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler