【问题标题】:returning null or throw exception返回 null 或抛出异常
【发布时间】:2012-12-22 21:21:36
【问题描述】:

我正在开发一个简单的网络服务和客户端。查看我的服务的 sn-p:

 @webService
 public Car carData(int id)  {
   try {
    return carDAO.getCars(id);
    } catch (NullPointerException e) {
        System.out.println("Error: "+e.getLocalizedMessage());

    }
    return  null;

}

是否可以将null返回给客户端,然后客户端应该处理null或者Web服务处理null并抛出异常更好?

更新: 如何返回 nullpointerexception 而不是返回 null?

你会推荐什么?

谢谢

【问题讨论】:

  • 如果是web,为什么不返回一个有效的HTTP响应码和相应的错误信息呢?
  • 现在我只是在控制台中测试:)
  • 最好的方法是给出一个有效的答案。如果有任何异常,最好自己抛出服务异常(故障),让客户端来处理。更多信息:SOAP faults or results object?
  • 这是UI层还是逻辑层?如果是 UI 层并且 UI 是基于 HTTP 的,那么正确的响应是带有状态代码和某种形式的内容(例如错误消息)的 HTTP 响应。但是,您正在测试它应该包括某种复制应用程序上下文的 HTTP 工具。对逻辑层进行单元测试可以跳过 HTTP 工具,因为不涉及 UI。
  • 忘记网络服务和客户端吧。我只想知道在基本示例中使用哪种方法更好。我刚刚更新了问题。

标签: java exception null nullpointerexception return


【解决方案1】:

对此可能会有一百万种不同的意见,但我会告诉你我会怎么做。

通常远程服务已经能够在进行远程调用并随后失败时抛出IOException,所以我想尽量让我的客户不必处理RuntimeException或其任何子类(其中包括NullPointerException)。如果您的服务抛出 RuntimeException 并且客户端打印出堆栈跟踪,那么客户端开发人员会感到困惑,因为堆栈跟踪与在服务器上运行的代码有关,开发人员可能很少或根本无法控制。理想情况下,客户端应该只需要处理返回 null 而不是预期响应的情况。仅当 null 不足以告诉客户端出现问题或问题源于客户端提供的输入存在问题时,才在服务器端抛出 Exception

【讨论】:

    【解决方案2】:

    您可以在 JAX-WS Web 服务中使用 SOAP 错误。这样,您可以在未找到先决条件时引发自定义异常。客户对发生的事情有了更好的了解。

    为此,您需要一个带有@WebFault 注释的异常。你可以在Using SOAP Faults and Exceptions in Java JAX-WS Web Services - Eben Hewitt on Java 中找到一个很好的例子。

    Users Guide » GlassFish » Metro » JAX-WS你可以找到这个例子:

    package fromjava.server;
    
    import javax.jws.WebService;
    
    @WebService
    public class AddNumbersImpl {
        /**
         * @param number1
         * @param number2
         * @return The sum
         * @throws AddNumbersException if any of the numbers to be added is 
         * negative.
         */
        public int addNumbers(int number1, int number2) throws 
                AddNumbersException {
            if (number1 < 0 || number2 < 0) {
                throw new AddNumbersException("Negative number cant be " +
                        "added!", "Numbers: " + number1 + ", " + number2);
            }
            return number1 + number2;
        }
    }
    

    例外:

    package fromjavahandler.server;
    
    public class AddNumbersException extends Exception {
    
        String detail;
    
        public AddNumbersException(String message, String detail) {
            super(message);
            this.detail = detail;
        }
    
        public String getDetail() {
            return detail;
        }
    }
    

    JAX-WS 运行时自动生成故障。

    【讨论】:

      【解决方案3】:

      您不应该获得 NPE。如果你这样做了,这可能意味着你的服务没有初始化,你应该抛出一个 IllegalStateException 或回复一条消息给客户端,说 Web 服务不可用

      【讨论】:

        猜你喜欢
        • 2012-06-08
        • 1970-01-01
        • 2018-07-27
        • 1970-01-01
        • 2016-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-07
        相关资源
        最近更新 更多