为什么我们需要在C ++中检查空指针,而不是在Java中检查空指针?

时间:2018-09-18 07:00:46

标签: java c++

假设,我有一个名为RequestType的类。在Java中,代码倾向于不检查是否有新对象为空引用:

RequestType request = new RequestType();
// if (request == null)   // missing

但是C ++代码倾向于检查分配:

RequestType* request = new RequestType();
if (nullptr == request)      // check

为什么我们需要检查C ++中的requestType是否为nullptr,但是在Java中无需进行检查就可以使用它?

2 个答案:

答案 0 :(得分:1)

您的前提有误(也许是由平庸的样本告知)。

在两种语言中,new运算符将成功或引发异常(分别为java.​lang.​OutOfMemoryErrorstd::​bad_alloc)。因此,无需检查这样的新分配对象。 (请注意,我在这里谈论的是标准C ++,一些古老的标准前编译器会返回null而不是抛出错误。)

当函数在其控制范围之外接收参数时,防御性程序员通常将检查Java引用和C ++指针,二者均可以为null。对C ++引用采取防御措施的情况较少见,因为隐式契约是我们不使用C ++创建空引用。


摘要

  • 新分配的对象在Java中永远不能为空:

    Request request = new Request();
    // request cannot be null
    

    在C ++中也不是

    Request* request = new Request();
    // request cannot be null
    
  • 函数参数或返回值在Java中可能为空:

    void processRequest(Request request) {
         // request might be null
         String body = request.body();
         // body might be null
    

    在C ++中:

    void processRequest(const Request *request) {
         // request might be null
         const char *body = request->body();
         // body might be null
    
    void processRequest(const Request& request) {
         // &request assumed non-null
         std::string body = request.body();
         // body can't be null (it's not a pointer)
    

答案 1 :(得分:-3)

在Java中,以下语句显式创建对象,除非它是默认构造函数,否则它永远不会是null

RequestType requestType = new RequestType();

但是,如果您以方法参数的形式接收此对象,或者在return语句中接收到该对象,或者您的构造函数在创建此对象时正在执行一些逻辑,则可能是{{1} }。

因此,同样在Java中,您需要检查对象是否为null