質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

3回答

4827閲覧

Javaでシンボルが見つからないというエラー

Yossy__

総合スコア6

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2018/03/28 07:19

編集2022/01/12 10:55

Javaでの課題で以下の様なコードを作成しました。
最下部にエラーの内容も載せていますがどこのエラーなのか何度見返しても分からなかったので是非お力を貸していただけたら助かります。

本日が締め切りのため端的にどこを直せばいいのを書いて下さるだけで構いません。

よろしくお願いいたします。

Java

1 2 3import java.io.*; 4 5//社員情報の設定・調査・画面出力 6class Employee 7{ 8 //フィールド宣言 9 public static int nofEmployee = 0; //社員数 10 protected String name; //名前 11 protected int age; //年齢 12 13 //コンストラクタ 14 public Employee() 15 { 16 //処理開始メッセージを画面出力 17 System.out.println("社員を作成します。"); 18 19 //社員数を1カウントアップ 20 nofEmployee++; 21 22 //名前フィールド初期化 23 name = "未設定"; 24 25 //年齢フィールド初期化 26 age = -1; 27 } 28 29 //名前・年齢フィールド値設定メソッド利用コンストラクト 30 public Employee(String n,int a) 31 { 32 //処理開始メッセージを画面出力 33 System.out.println("社員を作成します。"); 34 35 //社員数を1カウントアップ 36 nofEmployee++; 37 38 //社員情報をフィールド値設定 39 setEmployee(n,a); 40 } 41 42 //名前設定メソッド 43 public void setEmployee(String n) 44 { 45 //設定メッセージを画面出力 46 System.out.println("名前を " + n +" に設定します"); 47 48 //名前フィールドに引数設定 49 name = n; 50 } 51 52 //年齢設定メソッド 53 public void setEmployee(int a) 54 { 55 //年齢が18歳から60歳の場合 56 if(18 <= a && a <= 60) 57 { 58 //年齢フィールドに引数設定 59 age = a; 60 } 61 else 62 { 63 //エラーメッセージの出力 64 System.out.println("年齢が正しくありません"); 65 System.out.println("年齢は18以上60未満で設定してください。"); 66 } 67 } 68 69 //年齢と名前設定メソッド 70 public void setEmployee(String n,int a) 71 { 72 //設定メッセージを画面出力 73 System.out.println("名前と年齢を設定します"); 74 75 //名前フィールドに引数設定 76 setEmployee(n); 77 78 //年齢フィールドに引数設定 79 setEmployee(a); 80 } 81 82 //社員数出力メソッド 83 public static void showNofEmployee() 84 { 85 System.out.println("社員は" + nofEmployee + "人います。"); 86 } 87 88 //社員情報画面出力メソッド 89 void show() 90 { 91 //社員名と年齢を画面出力 92 System.out.println("社員の名前は" + name + "です。"); 93 System.out.println("年齢は" + age + "歳です。"); 94 } 95} 96 97//Employeeクラスの講師の担当科目設定サブクラス 98class Teacher extends Employee 99{ 100 //フィールド宣言 101 private char subject; 102 103 //講師作成のコンストラクタ 104 public Teacher() 105 { 106 //講師属性設定メッセージを画面出力 107 System.out.println("講師を作成します"); 108 109 //情報がないため、科目フィールドに'-'を設定 110 subject='-'; 111 } 112 113 //講師属性作成と設定のコンストラクタ 114 public Teacher(String n, int a, char s) 115 { 116 //講師属性設定メッセージを画面出力 117 System.out.println("講師を作成します"); 118 119 //講師属性設定メッセージを画面出力 120 setTeacher(n, a, s); 121 122 } 123 124 //講師属性設定メソッド 125 public void setTeacher(String n, int a, char s) 126 { 127 //講師の名前と年齢を設定 128 setEmployee(n,a); 129 130 //講師の担当科目を設定 131 setSubject(s); 132 } 133 134 //講師の担当科目を英語と算数に限定して設定メソッド 135 public void setSubject(char s) 136 { 137 //担当科目が英語か算数のとき 138 if(s=='E'||s=='S') 139 { 140 //講師の担当科目設定メッセージ画面出力 141 System.out.println("担当科目を" + s + "に設定します。"); 142 143 //講師の担当科目を設定 144 subject=s; 145 } 146 else 147 { 148 //担当科目の種類に関するエラーメッセージを画面出力 149 System.out.println("担当科目が正しくありません。"); 150 System.out.println("担当科目は英語(E)か算数(S)を設定してください。"); 151 } 152 } 153 154 //講師の属性を画面出力メソッド 155 public void show() 156 { 157 //講師の名前、年齢、担当科目と画面出力メソッド 158 System.out.println("講師の名前は" + name + "です。"); 159 System.out.println("年齢は" + age + "歳です。"); 160 System.out.println("担当科目は" + subject + "です。"); 161 } 162 163 //給与を計算メソッド 164 int calcPayroll(double h) 165 { 166 //定数宣言 167 final int WAGE_BASIC=2000; //時給単価 168 169 //給与額を戻す 170 return (int)(WAGE_BASIC * h); 171 172 } 173} 174 175//Employeeクラスの職員の職種情報設定サブクラス 176class Worker extends Employee 177{ 178 179 //フィールド宣言 180 private char jobType; //職種 181 182 //職員作成コンストラクタ 183 public Worker() 184 { 185 //職員属性設定メッセージを画面出力 186 System.out.println("職員を作成します"); 187 188 //情報がないため、職種フィールドに'-'を設定 189 jobType='-';; 190 } 191 192 //職員作成コンストラクタ(職種情報あり) 193 public Worker(String n,int a,char s) 194 { 195 //職員属性設定メッセージを画面出力 196 System.out.println("職員を作成します"); 197 198 //職員情報設定 199 setWorker(n,a,s); 200 } 201 202 203 //職員属性設定メソッド 204 public void setWorker(String n,int a,char s) 205 { 206 //職員の名前と年齢を設定 207 208 setEmployee(n,a); 209 210 //職員の職種を設定 211 setJobType(s); 212 } 213 214 //職員の職種を事務とドライバに限定して設定メソッド 215 public void setJobType(char s) 216 { 217 //職種が事務職、ドライバのいずれかのとき 218 if(s=='J'||s=='D') 219 { 220 //職種を設定メッセージ画面出力 221 System.out.println("職種を" + s + "に設定します。"); 222 223 //講師の担当科目を設定 224 jobType=s; 225 } 226 else 227 { 228 //職種に関するエラーメッセージを画面出力 229 System.out.println("職種が正しくありません。"); 230 System.out.println("職種は事務(J)かドライバ(D)を設定してください。"); 231 } 232 } 233 234 //職員の属性を画面出力メソッド 235 public void show() 236 { 237 //職員属性を画面出力 238 System.out.println("職員の名前は" + name + "です。"); 239 System.out.println("年齢は" + age + "歳です。"); 240 System.out.println("職種は" + jobType + "です。"); 241 } 242 243 //給与を計算メソッド 244 int calcPayroll(double h) 245 { 246 //定数宣言 247 final int WAGE_BASIC=1000; //時給単価 248 249 //給与額を戻す 250 return (int)(WAGE_BASIC * h); 251 252 } 253} 254 255// 256class S12_5_setEmpInfoCalcPayroll 257{ 258 public static void main(String[] args) throws IOException 259 { 260 //変数宣言 261 char menu = 't'; //社員種別 262 String str; //キーボード入力文字列 263 String namae; //講師の名前 264 int toshi; //講師の年齢 265 char shurui; //講師の職種 266 double hour; //労働時間 267 double pay; //給料 268 269 //オブジェクト作成 270 Employee[] emp = new Employee[10]; 271 272 //キーボード入力用オブジェクト作成 273 BufferedReader br = 274 new BufferedReader(new InputStreamReader(System.in)); 275 276 277 //社員種別入力のプロンプト出力 278 System.out.print("社員の種別? 講師(t)/職員(w)/終了(q)>"); 279 280 //入力文字列の受け取り 281 str = br.readLine(); 282 283 //社員の種別情報の受け取り 284 menu = str.charAt(0); 285 286 //社員属性の設定 287 while(menu != 'q') 288 { 289 //社員種別が講師のとき 290 if(menu == 't') 291 { 292 //名前入力 293 System.out.print("講師の名前?>"); 294 295 //名前設定 296 namae = br.readLine(); 297 298 //年齢入力 299 System.out.print("講師の年齢?>"); 300 301 //入力文字列の受け取り 302 str = br.readLine(); 303 304 //講師の年齢を設定 305 toshi = Integer.parseInt(str); 306 307 //講師の担当科目入力 308 System.out.print("担当科目? 英語(E)/ 算数(S)?>"); 309 310 //入力文字列の受け取り 311 str = br.readLine(); 312 313 //講師の担当科目を設定 314 shurui = str.charAt(0); 315 316 //講師属性を社員オブジェクトに設定 317 emp[Employee.nofEmployee]= 318 new Teacher(namae, toshi, shurui); 319 } 320 //社員種別が職員の時 321 else if(menu=='w') 322 { 323 //名前入力 324 System.out.print("職員の名前?>"); 325 326 //名前設定 327 namae = br.readLine(); 328 329 //年齢入力 330 System.out.print("職員の年齢?>"); 331 332 //入力文字列の受け取り 333 str = br.readLine(); 334 335 //講師の年齢を設定 336 toshi = Integer.parseInt(str); 337 338 //講師の担当科目入力 339 System.out.print("職種? 事務(J)/ ドライバ(D)?>"); 340 341 //入力文字列の受け取り 342 str = br.readLine(); 343 344 //講師の担当科目を設定 345 shurui = str.charAt(0); 346 347 //講師属性を社員オブジェクトに設定 348 emp[Employee.nofEmployee]= 349 new Worker(namae, toshi, shurui); 350 } 351 352 //社員種別入力をプロンプト表示 353 System.out.print("社員の種別? 講師(t)/ 職員(w)/終了(q)?>"); 354 355 //入力文字列の受け取り 356 str = br.readLine(); 357 358 //社員の種別情報の受け取り 359 menu = str.charAt(0); 360 361 } 362 363 //社員数を表示 364 Employee.showNofEmployee(); 365 366 //社員全員の社員属性を表示 367 for(int i=0; i<Employee.nofEmployee; i++) 368 { 369 //社員属性表示 370 emp[i].show(); 371 372 //勤務時間に関するプロンプト出力 373 System.out.print("勤務時間(h)>"); 374 375 //入力文字列の格納 376 str = br.readLine(); 377 hour= Integer.parseInt(str); 378 379 //給与額を画面出力 380 System.out.println("給与は" + emp[Employee.nofEmployee].calcPayroll(hour) + "円です。"); 381 382 383 } 384 } 385}

コンパイルすると以下のエラーが出てしまいます。

F:\java\0>javac S12_5_setEmpInfoCalcPayroll.java
S12_5_setEmpInfoCalcPayroll.java:385: エラー: シンボルを見つけられません
System.out.println("給与は" + emp[Employee.nofEmployee].calcPayroll(hour) + "円です。");

シンボル: メソッド calcPayroll(double)
場所: クラス Employee
エラー1個

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

keicha_hrs

2018/03/28 07:27

コードはコード記述用の修飾をかけてください。フォームで<code>というボタンを押すと雛形が出てきます。コード用の修飾の中では行頭スペースも使えますので、閲覧もしやすくなります。
Yossy__

2018/03/28 07:30

ありがとうございます。初めての投稿でやり方が分からなかったため見難いものにになってしまいました。編集致しました。
guest

回答3

0

スーパークラスからサブクラスは見えません。Employeeクラスを継承したWorkerクラスやTeacherクラスでcalcPayrollメソッドを実装しても、Employeeクラスから使うことはできません。

よくある方法としては、EmployeeクラスのcalcPayrollメソッドをWorkerクラスやTeacherクラスがオーバーライドするようにし、さらにEmployeeクラスからWorkerやTeacherのインスタンスを新しく作れるようにしておくことです。こうすることで、条件分岐させずにcalcPayrollメソッドを使えるようになります。詳しい仕組みは「ポリモーフィズム」について調べてみてください。

投稿2018/03/28 07:49

Udomomo

総合スコア1524

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

コンパイルエラー自体はEmployeeクラスにcalcPayrollメソッドが実装されていないからではないでしょうか…

投稿2018/03/28 07:40

terrace

総合スコア249

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

本題の解決とは別に、下記は誤りですね。

Java

1 //給与額を画面出力 2 System.out.println("給与は" + emp[Employee.nofEmployee].calcPayroll(hour) + "円です。"); 3

これではこの行の実行で「必ずNullPointerException」ですね。恐らく、emp[i].calcPayroll(hour)としたかったところを、ちょっと勘違いしたのでしょう。


こういう回答は良くないんでしょうね、やっぱり・・・。

投稿2018/03/28 08:57

編集2018/03/28 16:37
keicha_hrs

総合スコア6766

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問