回答編集履歴

4

誤字を修正しました

2016/03/17 05:00

投稿

tatsuya6502
tatsuya6502

スコア2035

test CHANGED
@@ -82,7 +82,7 @@
82
82
 
83
83
  yz = new int[19];
84
84
 
85
- }
85
+ }
86
86
 
87
87
 
88
88
 

3

誤字を修正しました

2016/03/17 05:00

投稿

tatsuya6502
tatsuya6502

スコア2035

test CHANGED
@@ -52,9 +52,9 @@
52
52
 
53
53
 
54
54
 
55
- 0. `int xz[] = ...` としているが、これだと、コンストラクタ内にローカル変数を新たに作ってしまうので、メンバ変数 `xz` と `zy` が初期化できてない。
55
+ 0. `int xz[] = ...` としているが、これだと、コンストラクタ内にローカル変数を新たに作ってしまうので、メンバ変数 `xz` と `yz` が初期化できてない。
56
56
 
57
- 0. `xz` と `xy` を初期化する前に、スレッドをスタートさせている。
57
+ 0. `xz` と `yz` を初期化する前に、スレッドをスタートさせている。
58
58
 
59
59
 
60
60
 
@@ -82,7 +82,7 @@
82
82
 
83
83
  yz = new int[19];
84
84
 
85
- }
85
+ }
86
86
 
87
87
 
88
88
 

2

回答に追記しました。

2016/03/17 04:58

投稿

tatsuya6502
tatsuya6502

スコア2035

test CHANGED
@@ -35,3 +35,65 @@
35
35
 
36
36
 
37
37
  この初期化処理ですが、Appletの場合は、コンストラクタではなくて、`public void init()` メソッドに書きます。なので、`public ball()` を `public void init()` に書き換えれば動きそうな気がします。試してみてください。
38
+
39
+
40
+
41
+ ---
42
+
43
+ **2016年3月17日追記**
44
+
45
+
46
+
47
+ 元のままでも玉は表示されていて、コンストラクタを init() に変えてもダメだったのですね。
48
+
49
+
50
+
51
+ コンストラクタ内のコードですが、よく見ると2つ問題があります:
52
+
53
+
54
+
55
+ 0. `int xz[] = ...` としているが、これだと、コンストラクタ内にローカル変数を新たに作ってしまうので、メンバ変数 `xz` と `zy` が初期化できてない。
56
+
57
+ 0. `xz` と `xy` を初期化する前に、スレッドをスタートさせている。
58
+
59
+
60
+
61
+ おそらく今は1つ目の理由で、スタートしたスレッドが玉を描いて、次にブロックを描こうとした瞬間に、NullPointerException が起きて、プログラムが終了しているのだと思います。また、1だけを直して、2を直さないと、タイミングによっては、やはり NullPointerException になってしまいます。
62
+
63
+
64
+
65
+ 以下のように書き換えてみてください。なお2つ目の問題については、コンストラクタは変数の初期化を行い、init() ではスレッドをスタートするようにしてみました。(あと、Javaではクラス名の頭文字は大文字にする慣習があるので、`ball` を `Ball`に変更してます。)
66
+
67
+
68
+
69
+ ```Java
70
+
71
+ public class Ball extends Applet implements Runnable {
72
+
73
+
74
+
75
+ public Ball() {
76
+
77
+ vx=2;
78
+
79
+ vy=2;
80
+
81
+ xz = new int[19];
82
+
83
+ yz = new int[19];
84
+
85
+ }
86
+
87
+
88
+
89
+ public void init() {
90
+
91
+ thread = new Thread(this);
92
+
93
+ thread.start();
94
+
95
+ }
96
+
97
+ ```
98
+
99
+

1

説明を少し追加しました。

2016/03/17 04:56

投稿

tatsuya6502
tatsuya6502

スコア2035

test CHANGED
@@ -28,10 +28,10 @@
28
28
 
29
29
 
30
30
 
31
- }
31
+ }
32
32
 
33
33
  ```
34
34
 
35
35
 
36
36
 
37
- この処理ですが、Appletの場合は、コンストラクタではなくて、`public void init()` メソッドに書きます。なので、`public ball()` を `public void init()` に書き換えれば動きそうな気がします。試してみてください。
37
+ この初期化処理ですが、Appletの場合は、コンストラクタではなくて、`public void init()` メソッドに書きます。なので、`public ball()` を `public void init()` に書き換えれば動きそうな気がします。試してみてください。