Java 返回null或抛出异常

Java 返回null或抛出异常,java,exception,null,nullpointerexception,return,Java,Exception,Null,Nullpointerexception,Return,我正在开发一个简单的web服务和客户端。请参阅我的服务片段: @webService public Car carData(int id) { try { return carDAO.getCars(id); } catch (NullPointerException e) { System.out.println("Error: "+e.getLocalizedMessage()); } return null; } 是否可以将

我正在开发一个简单的web服务和客户端。请参阅我的服务片段:

 @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

你推荐什么


谢谢

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


通常,远程服务已经能够在远程调用发出并随后失败时抛出
IOException
,因此我希望尽量避免客户端处理
RuntimeException
或其任何子类(包括
NullPointerException
)的可能性。如果您的服务抛出一个
RuntimeException
,并且客户端打印出堆栈跟踪,这会让客户端开发人员感到困惑,因为堆栈跟踪与服务器上运行的代码有关,而开发人员可能无法控制这些代码。理想情况下,客户端只需处理返回
null
而不是预期响应的情况。如果
null
不足以告诉客户机出了问题,或者问题源于客户机提供的输入问题,则仅在服务器端抛出
异常。

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

为此,您需要一个带有
@WebFault
注释的异常。你可以在中找到一个很好的例子

在中,您可以找到以下示例:

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;
    }
}

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

您不应该得到NPE。如果您这样做,则可能意味着您的服务尚未初始化,您可能应该抛出一个IllegalStateException,或者向客户端返回一条消息,说明web服务不可用,为什么不返回一个有效的HTTP响应代码和相应的错误消息呢?现在我只是在控制台中测试:)最好的方法是给出一个有效的答案。如果存在任何类型的异常,最好抛出您自己的服务异常(fault),让客户机来处理它。更多信息:这是UI层还是逻辑层?如果是UI层,并且UI是基于HTTP的,那么正确的响应是带有状态代码和某种形式的内容(例如错误消息)的HTTP响应。然而,您在测试它时,应该包括某种复制应用程序上下文的HTTP工具。逻辑层的单元测试可以跳过HTTP线束,因为它不涉及UI。忘记web服务和客户端吧。我只是想知道在基本示例中使用哪种方法更好。我刚刚更新了问题。
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;
    }
}