未定義の動作ではなく、nullptrオブジェクトのメソッドを呼び出すときにC++でNPEをスローすることはできますか? SEGFAULTシグナル用のハンドラを作成することはできますが、すべてのSEGFAULTがNullPointerExceptionであるわけではないので、これは本当に危険です。私がif節をチェックインするだけでそれをしなければならない場合、そうする有効な方法はありますか?たぶんコンパイル時?C++でNullPointerExceptionをスローする
1
A
答えて
2
はい、あなたは本当に良いアイデアではありません(現代の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.
}
+0
C++ 17では、std :: bad_optional_access例外を使用して同じ機能を提供するstd :: optionalの
0
例外処理のもう一つの方法: NULLポインタを使用して関数を呼び出す
#include <iostream>
#include <typeinfo>
using namespace std;
char str_NullPointer[25] = "NULL Pointer exception";
char str_Arithmetic[25] = "Arithmetic exception";
class A
{
public:
int i = 20;
public:
int function()
{
printf("Function start\n");
try
{
if (this)
{
printf("value of i = %d \n", i);
}
else
{
throw str_NullPointer; /* Exception thrown in Case 2 */
}
}
catch(const int s)
{
printf("%d\n", s);
}
catch(const char* s)
{
printf("%s in %s\n", s, typeid(this).name()); /* Exception and Class Name */
}
printf("Function end\n\n\n");
}
};
int main() {
//code
printf("Case 1: With Pointer\n");
A *obj = new A();
obj->i = 20;
obj->function();
printf("Case 2: With NULL Pointer\n");
delete obj;
obj = NULL;
obj->function();
return 0;
}
出力:
Case 1: With Pointer
Function start
value of i = 20
Function end
Case 2: With NULL Pointer
Function start
NULL Pointer exception in P4abcd
Function end
関連する問題
- 1. Hibernateはnullpointerexceptionをスローする
- 2. Java - EnumSet.add(enum)、NullPointerExceptionをスローする
- 3. Javaアプレット:inetAddress.getHostName()がNullPointerExceptionをスローする
- 4. Java - Jdbc接続スローNullPointerException
- 5. NullPointerExceptionがスローされない
- 6. SQLite INNER JOINがNullPointerExceptionをスローします
- 7. ServiceTestCaseでService.startForeground()を実行すると、NullPointerExceptionがスローされる
- 8. なぜAndroidがNullPointerExceptionをスローするのですか?
- 9. 私のリストに追加できない、NullPointerExceptionをスローする
- 10. 一部のデバイスでgetMap()がNullPointerExceptionをスローする
- 11. ファイルサイズが1GBを超えると、Gson.toJsonがNullPointerExceptionをスローする
- 12. なぜNullPointerExceptionがスローされるのですか?
- 13. スクロール後にListViewのアイテムのonItemClickスローNullPointerException
- 14. throwできない場所でNullPointerExceptionがスローされる
- 15. SwingWorker done()メソッドは、get()でnullpointerexceptionをスローします
- 16. null.asInstanceOf [Int]がNullPointerExceptionをスローしないのはなぜですか?
- 17. SharedPreferencesのインスタンス化時にAndroidがNullPointerExceptionをスローする
- 18. 数時間後にハンドラがNullPointerExceptionをスローする
- 19. Mavenアップデート中にEclipseがNullPointerExceptionをスローする
- 20. Struts2-tiles-plugin 2.3.28 - StrutsTilesListenerがNullPointerExceptionをスローする
- 21. コンポーネントが初期化されていないNUllPointerExceptionをスローする
- 22. JVMはNullPointerExceptionをスローするタイミングをどのように知るのですか
- 23. Spinnerで作業中に不思議なNullPointerExceptionがスローされる
- 24. RichFacesファイルのアップロードでNullPointerExceptionがスローされる
- 25. MockMultipartHttpServletRequestを使用したユニットテスト(ItemInputStream.makeAvailableでNullPointerExceptionをスロー)
- 26. 配列メンバーにアクセスするたびにNullPointerExceptionがスローされる
- 27. なぜSQLiteQueryBuilderがActivity.onRestart()の後にcomputeProjection()でNullPointerExceptionをスローするのですか?
- 28. 私のプロジェクトをAOTでコンパイルするとNullPointerExceptionがスローされます
- 29. HibernateはHqlSqlWalkerからNullPointerExceptionをスローします
- 30. 私のJava関数はnullpointerexceptionをスローしますか?
確かに可能、質問があり、それが役に立つのですか?何かをデバッグしようとしていますか?ヌルポインタを逆参照する必要がある場合でも、あなたのプログラムは何らかの形でまだ役立つでしょうか? – Jfevold
私は小さなプログラミング言語をコーディングしようとしています。私はC++にコンパイルするので、未定義の動作はしません。これをどのように処理できるか知りたいのですが。 – Exagon
"nullptrオブジェクト"のようなものはありません。あなたはオブジェクトを持っているか、そうではありません。そうしないと、メンバー関数を呼び出すオブジェクトがないため、オブジェクトのメンバー関数を呼び出すことはできません。 –