该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2010-08-26
awfe 写道 Checked Exception就是我们固定洲际导弹,就在那架着给别人看,随时可能发射。任何和我们打交道的都必须提前考虑好把我们惹毛了怎么接着核弹。
Unchecked Exception机动的洲际导弹,就没打算让你提前防着,怒了直接就扔出去,谁也别想拦着。当然你拦住了我也没办法。 检查个输入参数需要动用洲际导弹吗?自己看情况,一看国家类型(比如朝鲜...),二看输入的是什么东西(人家给你你扔个核弹进来...)。 断言那就是真理部的各类禁令,也就自己乐呵乐呵吧,拿不出手的。 比喻的生动活泼... |
|
返回顶楼 | |
发表时间:2010-08-26
bugmenot 写道 polaris1119 写道 实际中应该使用if else或Exception的都有,因而下面的回复也是各抒己见,很多人都有一定的道理。在此先列出几个个人觉得比较靠谱的回复:
5)IcedCoffee:java规范的定义是说异常不要参与控制流程,你不能把异常作为一种正常的控制流程作为程序的一部分,这样是不对的. 面试官正真要考的就是这个.. 没有哪个公司会用异常来处理参数验证.. 楼主大大和IcedCoffee,Google就用异常来处理参数验证: guava-r06 package com.google.common.base; public final class Preconditions { /** * Ensures the truth of an expression involving one or more parameters to the * calling method. * * @param expression a boolean expression * @param errorMessageTemplate a template for the exception message should the * check fail. The message is formed by replacing each {@code %s} * placeholder in the template with an argument. These are matched by * position - the first {@code %s} gets {@code errorMessageArgs[0]}, etc. * Unmatched arguments will be appended to the formatted message in square * braces. Unmatched placeholders will be left as-is. * @param errorMessageArgs the arguments to be substituted into the message * template. Arguments are converted to strings using * {@link String#valueOf(Object)}. * @throws IllegalArgumentException if {@code expression} is false * @throws NullPointerException if the check fails and either {@code * errorMessageTemplate} or {@code errorMessageArgs} is null (don't let * this happen) */ public static void checkArgument(boolean expression, @Nullable String errorMessageTemplate, @Nullable Object... errorMessageArgs) { if (!expression) { throw new IllegalArgumentException( format(errorMessageTemplate, errorMessageArgs)); } } /** * Ensures that an object reference passed as a parameter to the calling * method is not null. * * @param reference an object reference * @return the non-null reference that was validated * @throws NullPointerException if {@code reference} is null */ public static <T> T checkNotNull(T reference) { if (reference == null) { throw new NullPointerException(); } return reference; } } 这其实就是用if{}else{}来处理业务逻辑了.. 如果条件不满足就抛出异常..这是对的啊..不矛盾.. java规范里说的不能用异常机制参与业务逻辑是指用try catch来控制流程这样是不对的.. |
|
返回顶楼 | |
发表时间:2010-08-26
同意楼上的观点。
|
|
返回顶楼 | |
发表时间:2010-08-26
讨论个问题,终止流程算不算控制流a?
考虑一下一个三层的嵌套调用. 如果是if,else 控制,在结果可能情况较多时,就给返回相应的code,这样如果在第二层拿到第三层的code,是将code直接返给第一层还是说自己再做变换后返回? 如果不转换,那么第一层就给知道第三层的code定义,那么作为第一层似乎知道的有点多了.如果转换了一二层约定的code,第二层自己的事又多了. 如果是Exception,那么在每个层出现错误只要抛出自己的Exception即可. 由于每层的Exception的具体类型不同,所以只需要每层自己在提供一个由自己层抛出的Exception的处理handle即可. 各位实际中如何处理的? |
|
返回顶楼 | |
发表时间:2010-08-26
我觉得还是要看具体情况,而且那个面试题本来的意思也就要你回答用Exception异常还是if判断的具体情况。
|
|
返回顶楼 | |
发表时间:2010-08-26
异常的字面解释就是异乎寻常,当然包括业务层的不寻常。 if else 不说了。如果业务复杂,都难以想象,怎么绕出来。 |
|
返回顶楼 | |
发表时间:2010-08-27
这个问题值得这么讨论吗?实际中不都是两者结合用的吗?我晕.
|
|
返回顶楼 | |
发表时间:2010-09-19
大家的事务在什么地方控制的?我在service使用异常,因为不用异常无法做到事务回滚。
|
|
返回顶楼 | |
发表时间:2010-09-19
贫嘴男孩 写道 大家的事务在什么地方控制的?我在service使用异常,因为不用异常无法做到事务回滚。
Spring管理事务的话,默认出现RuntimeException时回滚的,所以不需要在service中显示抛出异常。一般事务都在service中控制的吧。 |
|
返回顶楼 | |
发表时间:2010-09-19
polaris1119 写道 贫嘴男孩 写道 大家的事务在什么地方控制的?我在service使用异常,因为不用异常无法做到事务回滚。
Spring管理事务的话,默认出现RuntimeException时回滚的,所以不需要在service中显示抛出异常。一般事务都在service中控制的吧。 有些业务上的逻辑异常不也得在service上抛吗 |
|
返回顶楼 | |