回答編集履歴

4

追記

2018/05/28 03:29

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -163,3 +163,137 @@
163
163
 
164
164
 
165
165
  時/分/秒について、それぞれ入力を求めるように書き直せば良いんじゃないでしょうか。
166
+
167
+
168
+
169
+ ---
170
+
171
+ もし例外を使うならこんな感じです。
172
+
173
+ ```Java
174
+
175
+ class Clock {
176
+
177
+ ...
178
+
179
+
180
+
181
+ public void setHour(int hour) {
182
+
183
+ if(hour > 0 && hour <= 23){
184
+
185
+ this.hour = hour;
186
+
187
+ } else {
188
+
189
+ throw new IllegalArgumentException();
190
+
191
+ }
192
+
193
+ }
194
+
195
+
196
+
197
+ ...
198
+
199
+ }
200
+
201
+ ```
202
+
203
+
204
+
205
+ ```Java
206
+
207
+ while(true){
208
+
209
+ try{
210
+
211
+ System.out.print("hourの数値を入力してください>" + " ");
212
+
213
+ String str = br.readLine();
214
+
215
+ clock.setHour(Integer.parseInt(str));
216
+
217
+ }catch(IllegalArgumentException e){
218
+
219
+ System.err.println("[ERROR] 数値を再入力してください");
220
+
221
+ }
222
+
223
+ }
224
+
225
+ ```
226
+
227
+
228
+
229
+ ---
230
+
231
+ もし返り値を使うならこんな感じです。
232
+
233
+ ```Java
234
+
235
+ class Clock {
236
+
237
+ ...
238
+
239
+
240
+
241
+ public boolean setHour(int hour) {
242
+
243
+ if(hour > 0 && hour <= 23){
244
+
245
+ this.hour = hour;
246
+
247
+ return true;
248
+
249
+ } else {
250
+
251
+ return false;
252
+
253
+ }
254
+
255
+ }
256
+
257
+
258
+
259
+ ...
260
+
261
+ }
262
+
263
+ ```
264
+
265
+
266
+
267
+ ```Java
268
+
269
+ while(true){
270
+
271
+ try{
272
+
273
+ System.out.print("hourの数値を入力してください>" + " ");
274
+
275
+ String str = br.readLine();
276
+
277
+
278
+
279
+ boolean result = clock.setHour(Integer.parseInt(str));
280
+
281
+ if(result) {
282
+
283
+ break;
284
+
285
+ } else {
286
+
287
+ System.err.println("[ERROR] 数値を再入力してください");
288
+
289
+ }
290
+
291
+ }catch(NumberFormatException e){
292
+
293
+ System.err.println("[ERROR] 数値を再入力してください");
294
+
295
+ }
296
+
297
+ }
298
+
299
+ ```

3

追記を受けて

2018/05/28 03:29

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -131,3 +131,35 @@
131
131
  これはとりあえずコンパイルエラーを排除してから考えましょう。
132
132
 
133
133
  いちおうヒントとしては、『セッターの中で値をチェックすれば良い』とだけ言っておきます。
134
+
135
+
136
+
137
+ 質問追記を受けて
138
+
139
+ ---
140
+
141
+ > 一度入力した数値が全ての値の範囲内であれば、全て入力されてしまいます…。
142
+
143
+
144
+
145
+ 単に入力を一度しか受け付けていないからかと。
146
+
147
+ > ```Java
148
+
149
+ System.out.print("数値を入力してください>" + " ");
150
+
151
+ String str = br.readLine();
152
+
153
+
154
+
155
+ > clock.setHour(Integer.parseInt(str));
156
+
157
+ clock.setMinute(Integer.parseInt(str));
158
+
159
+ clock.setSecond(Integer.parseInt(str));
160
+
161
+ > ```
162
+
163
+
164
+
165
+ 時/分/秒について、それぞれ入力を求めるように書き直せば良いんじゃないでしょうか。

2

回答書き込み

2018/05/27 14:09

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -1 +1,133 @@
1
+ 質問する際には、**必ず**実際のエラーメッセージを載せるようにしてください。
2
+
3
+
4
+
5
+ インスタンス化ができませんというエラー
6
+
7
+ ---
8
+
9
+ Clockをインスタンス化するときに適切な引数を与えていないのが原因です。
10
+
11
+
12
+
13
+ **Clockのコンストラクタの定義**
14
+
15
+ > ```Java
16
+
17
+ Clock(int hour, int minute, int second){
18
+
19
+ this.hour = hour;
20
+
21
+ this.minute = minute;
22
+
23
+ this.second = second;
24
+
25
+ }
26
+
27
+ > ```
28
+
29
+
30
+
31
+ こちらでは、int型の引数をみっつ受け取るようなインターフェースになっています。
32
+
33
+
34
+
35
+ **実際にインスタンス化を試みている箇所**
36
+
37
+ > ```Java
38
+
39
+ Clock clock = new Clock();
40
+
41
+ > ```
42
+
43
+
44
+
45
+ しかし、実際には引数が与えられていません。これが問題です。
46
+
47
+
48
+
49
+ #####解消するためには
50
+
51
+ 次の二つのアプローチが考えられます。
52
+
53
+ - インスタンス生成時に、適切な引数を渡すようにすること
54
+
55
+ - 引数なしのコンストラクタを用意し、各フィールドを適切に初期化すること
56
+
57
+
58
+
59
+ clock.setHourに引数がありませんというエラー
60
+
61
+ ---
62
+
63
+
64
+
65
+ 同じように、メソッドのインターフェースに沿った呼び出しがされていないからです。
66
+
67
+
68
+
69
+ **Clock#setHourの定義**
70
+
71
+ > ```Java
72
+
73
+ public void setHour(int hour) {
74
+
75
+ this.hour = hour;
76
+
77
+ }
78
+
79
+ > ```
80
+
81
+
82
+
83
+ int型の引数をひとつだけ受け取るように書かれています。
84
+
85
+
86
+
1
- 誤って投稿してしまました。しばしお待ちください。
87
+ **実際にメソッドを呼び出そうとしている箇所**
88
+
89
+ > ```Java
90
+
91
+ clock.setHour() = Integer.parseInt(str);
92
+
93
+ > ```
94
+
95
+
96
+
97
+ これは完全に使い方を誤っていますね。
98
+
99
+ セッターと言えど、その実態はふつうのメソッドと一緒です。
100
+
101
+
102
+
103
+ #####解消するためには
104
+
105
+ Integer.parseInt(str)の結果を、メソッドの**引数として**渡してやればいいです。
106
+
107
+ ```Java
108
+
109
+ clock.setHour(Integer.parseInt(str));
110
+
111
+ ```
112
+
113
+
114
+
115
+ 冗長な感がありますが、二行に分けて書くことも出来ます。
116
+
117
+ ```Java
118
+
119
+ int hour = Integer.parseInt(str);
120
+
121
+ clock.setHour(hour);
122
+
123
+ ```
124
+
125
+
126
+
127
+ hourは0~23,minuteは0~59,secondは0~59の間の値しか設定できないように制限すること。
128
+
129
+ ---
130
+
131
+ これはとりあえずコンパイルエラーを排除してから考えましょう。
132
+
133
+ いちおうヒントとしては、『セッターの中で値をチェックすれば良い』とだけ言っておきます。

1

修正

2018/05/22 15:52

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -1,5 +1 @@
1
- 質問にエラーがそのま記載されていませんので、文言は違うかもれません
1
+ 誤って投稿してしまいまししばしお待ちください。
2
-
3
-
4
-
5
- >