假设,我有一个名为RequestType
的类。在Java中,代码倾向于不检查是否有新对象为空引用:
RequestType request = new RequestType();
// if (request == null) // missing
但是C ++代码倾向于检查分配:
RequestType* request = new RequestType();
if (nullptr == request) // check
为什么我们需要检查C ++中的requestType是否为nullptr
,但是在Java中无需进行检查就可以使用它?
答案 0 :(得分:1)
您的前提有误(也许是由平庸的样本告知)。
在两种语言中,new
运算符将成功或引发异常(分别为java.lang.OutOfMemoryError
或std::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
。