c++ - 在 C++ 中抛出 NullPointerException

标签 c++ nullpointerexception nullptr

是否可以让 C++ 在调用 nullptr 对象上的方法时抛出 NPE,而不是进入未定义的行为?我可以为 SEGFAULT 信号创建一个处理程序,但这非常危险,因为并非每个 SEGFAULT 都是 NullPointerException。如果我必须通过检查 if 子句来做到这一点,是否有有效的方法来做到这一点?也许也在编译时?

最佳答案

是的,你可以,但这并不是一个好主意(无论如何你都不应该处理指针,在现代 C++ 中,指针保存在管理其生命周期的对象内)。

您始终可以定义一个保存指针的类。然后,当您尝试使用 operator->() 时,如果保存的指针为 nullptr,它将抛出异常。

template<typename T>
class ThrowingUniquePtr
{
     T*   ptr;
     public:
        // STUFF to create and hold pointer.

        T* operator->()
        {
            if (ptr) {
                return ptr;
            }
            throw NullPointerException; // You have defined this somewhere else.
        }
};

class Run
{
    public:
        void run() {std::cout << "Running\n";}
};
int main()
{
    ThrowingUniquePtr<Run>    x(new Run);
    x->run();  // will call run.

    ThrowingUniquePtr<Run>    y(nullptr);
    y->run();  // will throw.
}

关于c++ - 在 C++ 中抛出 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36970839/

相关文章:

c++ - 在 Windows 上编译的控制台应用程序是否可以在使用 DOSBox 的 Linux 和 MAC OS X 上运行?

C++:从 MIDI 消息中获取数据 (DWORD)

Java - 向 LinkedList 提供对象时接收 NullPointerException

c++ - 在 C++ 中将 boolean 变量声明为 NULL

c++ - RapidXML 节点在 try catch block 中具有正确的值,但它在 block 外为 nullptr

c++ - linux 正确的语法以通过配置传递 libstdc++.so.6 的自定义目录

c++ - 我应该如何在 C++ 中解释这个结构?

java - 空检查链与捕获 NullPointerException

java - JFrame按钮单击NullPointerException

c++ - 使用 const std::string& 作为方法参数类型时,处理 nullptr const char* 的正确方法是什么?