论坛首页 Java企业应用论坛

用if、Exception还是assert? ——看JavaEye论坛帖子:《面试题:用Exception异常还是if判断》的感想

浏览 14767 次
该帖已经被评为良好帖
作者 正文
   发表时间:2010-08-26  
awfe 写道
Checked Exception就是我们固定洲际导弹,就在那架着给别人看,随时可能发射。任何和我们打交道的都必须提前考虑好把我们惹毛了怎么接着核弹。

Unchecked Exception机动的洲际导弹,就没打算让你提前防着,怒了直接就扔出去,谁也别想拦着。当然你拦住了我也没办法。

检查个输入参数需要动用洲际导弹吗?自己看情况,一看国家类型(比如朝鲜...),二看输入的是什么东西(人家给你你扔个核弹进来...)。

断言那就是真理部的各类禁令,也就自己乐呵乐呵吧,拿不出手的。


比喻的生动活泼...
0 请登录后投票
   发表时间: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来控制流程这样是不对的..
0 请登录后投票
   发表时间:2010-08-26  
同意楼上的观点。
0 请登录后投票
   发表时间:2010-08-26  
讨论个问题,终止流程算不算控制流a?
考虑一下一个三层的嵌套调用.
如果是if,else 控制,在结果可能情况较多时,就给返回相应的code,这样如果在第二层拿到第三层的code,是将code直接返给第一层还是说自己再做变换后返回?
如果不转换,那么第一层就给知道第三层的code定义,那么作为第一层似乎知道的有点多了.如果转换了一二层约定的code,第二层自己的事又多了.
如果是Exception,那么在每个层出现错误只要抛出自己的Exception即可.
由于每层的Exception的具体类型不同,所以只需要每层自己在提供一个由自己层抛出的Exception的处理handle即可.
各位实际中如何处理的?
0 请登录后投票
   发表时间:2010-08-26  
我觉得还是要看具体情况,而且那个面试题本来的意思也就要你回答用Exception异常还是if判断的具体情况。
0 请登录后投票
   发表时间:2010-08-26  


异常的字面解释就是异乎寻常,当然包括业务层的不寻常。

if else 不说了。如果业务复杂,都难以想象,怎么绕出来。
0 请登录后投票
   发表时间:2010-08-27  
这个问题值得这么讨论吗?实际中不都是两者结合用的吗?我晕.
0 请登录后投票
   发表时间:2010-09-19  
大家的事务在什么地方控制的?我在service使用异常,因为不用异常无法做到事务回滚。
0 请登录后投票
   发表时间:2010-09-19  
贫嘴男孩 写道
大家的事务在什么地方控制的?我在service使用异常,因为不用异常无法做到事务回滚。

Spring管理事务的话,默认出现RuntimeException时回滚的,所以不需要在service中显示抛出异常。一般事务都在service中控制的吧。
0 请登录后投票
   发表时间:2010-09-19  
polaris1119 写道
贫嘴男孩 写道
大家的事务在什么地方控制的?我在service使用异常,因为不用异常无法做到事务回滚。

Spring管理事务的话,默认出现RuntimeException时回滚的,所以不需要在service中显示抛出异常。一般事务都在service中控制的吧。

有些业务上的逻辑异常不也得在service上抛吗
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics