为什么我们需要在C ++中检查空指针,而不是在Java中?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么我们需要在C ++中检查空指针,而不是在Java中?相关的知识,希望对你有一定的参考价值。
据说,我有一个名为RequestType
的类。在Java中,代码往往不会检查新对象是否为null引用:
RequestType request = new RequestType();
// if (request == null) // missing
但是C ++代码倾向于检查分配:
RequestType* request = new RequestType();
if (nullptr == request) // check
为什么我们需要在C ++中检查requestType是否是nullptr
,但是如果没有Java中的检查就可以使用它?
答案
你的前提是错误的(也许是平庸的样本)。
在这两种语言中,new
运算符将成功或抛出异常(分别为java.lang.OutOfMemoryError
或std::bad_alloc
)。所以从来没有必要像这样检查新分配的对象。 (请注意,我在谈论标准C ++ - 一些古老的标准前编译器将返回null而不是抛出)。
当函数接收到其控制之外的参数时,防御性程序员通常会检查Java引用和C ++指针,这两者都可以为null。使用C ++引用是如此的防御是不常见的,因为隐式契约是我们不在C ++中创建空引用。
摘要
- Java中新分配的对象永远不能为null:
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
。
以上是关于为什么我们需要在C ++中检查空指针,而不是在Java中?的主要内容,如果未能解决你的问题,请参考以下文章