| English | 意味 |
|---|---|
| NullPointerException/nʌl ˈpɔɪntə ekˈsepʃn/ | nullポインタ例外 |
オブジェクトのミューテーションとパラメータの再割り当ての違い
- コーラーはスコア10を持つStudentを参照しています。メソッドが s.addScore(5); と s = new Student("Other"); を実行した直後です。
- 元の共有オブジェクトのスコアは 15 になります。ローカルパラメータへの再割り当てはカラー変数を変化させません。なぜなら、Java は参照値をパラメータにコピーするためです。
オブジェクトをメソッドに渡す
- Java はメソッドパラメータに 参照値 をコピーします。オブジェクトそのものをコピーするわけではありません。メソッドのパラメータはカラーの変数と同じ オブジェクト を指しています。
- そのため、メソッドによるオブジェクトへの変更は カラーに可視化されます。プリミティブ型と参照型両方の引数は値渡しされます。コピーされた参照は共有オブジェクトにまだ到達できます。
プリミティブ対 オブジェクト引数
- プリミティブ型 の引数は コピー されるため、メソッドはカラーの変数を変えることはできません。オブジェクト引数の場合、コピーされた参照は同じオブジェクトに到達するため、メソッドはそのオブジェクトをミューテートできます。
changeInt(x)はxを変更することはできません;student.addScore(10)は その学生を変更します。メソッドが共有オブジェクトをミューテートしているのか、それとも単にローカルパラメータを再割り当てしているのかを問うてください。
オブジェクトを返す
- メソッドはオブジェクトへの 参照を返す ことができます——カラーはそれを共有します。
public Student topStudent() { return best; }はbestへの参照を手渡します。 bestを返すことは既存のオブジェクトを共有することを意味します。対照的に、return new Student("Copy");は新しいオブジェクトを構築してその参照を返します;メソッドはnullを返すこともできます。状態が共有されているかどうかを決定する前に、返り値式を読んでください。
コピーされた参照、共有されたオブジェクト;コピーされたプリミティブ
オブジェクトのスコアは変化しますが、プリミティブ x は変化しません。
オブジェクトをメソッドに渡すと、メソッドは...を受け取ります
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
Javaは参照値を別個のパラメータ変数にコピーします。2つの参照は同じオブジェクトに到達でき、パラメータの再割り当ては呼び出し側の變数を置き換えません。
メソッドはパラメータを操作することで呼び出し側のint変数を変更できます。
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
プリミティブはコピーされるため、呼び出し側のintは untouched( unchanged )です。
null参照を介してインスタンスメソッドを呼び出すと…がスローされます。
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
null ポイントは対象オブジェクトを指さないため、メソッドを呼び出す対象がありません。
メソッドはオブジェクトへの参照を返すことができ、呼び出し側がそれを共有します。
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
メソッドは既存のオブジェクト参照を返して、そのオブジェクトを呼び出し側と共有できます。別のメソッドは、代わりの新しいオブジェクトを構築して返すことができます。
null である可能性のある参照を安全に使うには、最初に確認する必要があります...
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
メソッドを呼び出す前に、null に対するガードを行ってください。
Student参照を返すすべてのメソッドは、以前に存在するオブジェクトを返さなければなりません。
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
False: return new Student("Other");は新しいオブジェクトを構築して返します。
null参照
- どのオブメントも指していない 参照は
nullです。nullを通じて インスタンス メソッドを呼び出すと、NullPointerException がスローされます。 null(例:"not found")を返すことは一般的です——カラーはそれをチェックする必要があります。使用される可能性がある null 参照の前にはif (s != null) { s.addScore(10); }でガードしてください。
オブジェクトを渡すと参照値がコピーされます——メソッドはカラーのオブジェクトを変えることができます;プリミティブ型を渡すと値がコピーされます——変えることはできません。 そこで student.addScore(10) はカラーのオブジェクトをミューテートしますが、 changeInt(x) はカラーの x をそのままにします。また、null 参照を通じてインスタンスメソッドを呼び出すと NullPointerException がスローされます——参照が null である可能性がある場合は、最初に != null をチェックしてください。
After the two statements, what is the original caller-referenced Student score?
難易度 2/5 · 140 コイン + 今日初回完了時に小ボーナス付与
The first statement mutates the original object to 15. The later local reassignment does not replace the caller reference.
メソッドはnew Student("Other");を返しますが、呼び出し側は結果を無視します。呼び出し側の既存のStudent変数はどうなりますか?
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
参照を返すことは、それを呼び出し側の變数に割り当てるものではありません。既存の変数はまだ元のオブジェクトを指しています。
参照対 値:
void addTen(Student s) { s.addScore(10); }— 渡されたオブジェクトを変化させる(共有参照)。void addTen(int x) { x += 10; }— 呼び出し手のintは変化しない(コピー値)。- 両方のパラメータ値はコピーされます。共有可能な可変状態に到達するのはコピーされた参照のみです。
の推論を新しいケースへ適用せよ
return s;とreturn new Student("Other");を比較します:前者は渡された参照を返します。後者は新しく構築されたオブジェクトを返します。どちらの場合も、呼び出し側が結果を代入するまでは呼び出し側の変数は変更されません。- 変化を予測するには、呼び出し側とパラメータを別々の参照変数として描き、それぞれがオブジェクトを指しているようにします。ミューテータ(Mutator)呼び出しではオブジェクトを更新し、パラメータの再割り当てではパラメータの矢印のみを更新します。
オブジェクトの参照を渡すと、その値がパラメータにコピーされるため、メソッドは呼び出し側のオブジェクトを変更できます。一方、プリミティブ型を渡すと値がコピーされるため、変更できません。メソッドはオブジェクトへの参照を返すことができます。オブジェクトへの参照がない状態は null です。これを通じてインスタンスメソッドを呼び出すと NullPointerException がスローされるため、最初にチェックする必要があります。