繁体   English   中英

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

[英]Why do we need to check null pointer in C++, but not in Java?

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

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

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

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

为什么我们需要在 C++ 中检查 requestType 是否为nullptr ,而在 Java 中不需要这样的检查就可以使用它?

你的前提是错误的(也许是平庸的样本)。

在这两种语言中, new运算符要么成功要么抛出异常(分别是java.​lang.​OutOfMemoryErrorstd::​bad_alloc )。 所以永远不需要像这样检查新分配的对象。 (注意这里我说的是标准 C++——一些古老的标准前编译器会返回 null 而不是抛出)。

当函数接收到超出其控制范围的参数时,防御性程序员通常会检查 Java 引用和 C++ 指针,这两者都可以为空。 对 C++ 引用进行如此防御的情况不太常见,因为隐含的约定是我们不会在 C++ 中创建空引用。


概括

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

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

    也不是在 C++ 中:

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

     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)

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

RequestType requestType = new RequestType();

但是,如果您将此对象作为方法参数接收,或者在return语句中,或者您的构造函数在创建此对象时正在执行一些逻辑,那么它有可能是null

所以,在java中,你也需要检查你的对象是否为null

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM