- ベストアンサー
javaの問題の動かし方?
平成17年春期 基本情報技術者試験午後問題の 問12 JAVA電卓プログラムの プログラム4を 実際にコーディングしたのですが コンパイルできません。 (全部で4つのプログラムから構成されていて、 プログラム1、2、3はコンパイル及び実行できました) 肝心のメインメソッドである最後のプログラム4がコンパイルできず 実際の検証が出来ないので困っています。 (エラー内容) CalculatorTest.java:30: シンボルを見つけられません。 シンボル: メソッド eventDispatched(CalculatorEvent) 場所 : Calculator の クラス calc.eventDispatched(event); (プログラム内容) //プログラム4 public class CalculatorTest{ public static void main(String[] args){ Calculator calc = new Calculator( new CalculatorOutput(){ public void display(int value){ System.out.println(value); } public void display(String value){ System.out.println(value); } }); String keys = args[0]; for (int i=0; i<keys.length(); i++){ char c = keys.charAt(i); CalculatorEvent event = null; if (c>= '0' && c<= '9'){ event = new CalculatorEvent( CalculatorEvent.DIGIT,c - '0'); }else if (c == '=' || c == '+' || c == '-' || c == '*' || c == '/'){ event = new CalculatorEvent( CalculatorEvent.OPERATOR, c); }else if (c == 'C'){ event = new CalculatorEvent( CalculatorEvent.CLEAR); } if(event != null) calc.eventDispatched(event); } } } 尚、eventDispatchedは、プログラム3で出てきました。 プログラム1、2、3、4は ソースファイル、クラスファイル共に同じ フォルダにあります。 プログラム4の 何処をどの様に変更したら コンパイル及び実行できるようになるでしょうか? 詳しい方教えて下さい。 宜しくお願い致します。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
Win98!? まあ、きっと大丈夫、うん。 ところでコマンドプロンプトで java -version をした結果を教えてくれないかしら。 それといったんクラスファイルをすべて削除して、 CalculatorTest.javaのみでコンパイルしてみて貰えるかな? その際、正常なら他のソースファイルも一緒に コンパイルされるわ。 CLASSPATHは http://www.hellohiro.com/appli.htm の下の方にある「◆変数の簡単な説明」が 的確な説明かしら。 ちなみに このサイト http://www.hellohiro.com/ はJavaの勉強にはいろいろ便利なので 暇のある時に一通り目を通しておくといいわ > iTEC JAVAプログラミング アイテックってことはJava初心者向けの本じゃないわね。 ある程度下地のできた人向けの試験対策本ね。 もしもう一冊買うなら ソフトバンククリエイティブの 「やさしいJava」あたりをお勧めしておくわ。 分厚いけどサンプルが多いし 文字も大きいし読みやすいわ。
その他の回答 (3)
- kacchann
- ベストアンサー率58% (347/594)
eventDispatched eventDispached さてどっち?? コンパイラはつねに正しい…。
お礼
ありがとうございました。 >コンパイラはつねに正しい。 コンパイル及び実行できました。
- askaaska
- ベストアンサー率35% (1455/4149)
実は私はこの問題知っているのよ。 講習で教えたことあるし。 > クラスパスがわかりません 問題を解く前にそこから勉強しないとね 最初に確認しておけば良かったわ。 どんな環境で行っているのかしら? それと実際にコンパイルした方法を書いてもらえると何か判るかも。
補足
ご回答を、ありがとうございます。 学習環境です。 OS:Win98SE JAVA:J2SE エディタ:秀丸エディタ テキスト:iTEC JAVAプログラミング(青表紙の本です) 尚、クラスパスの解説はありません。 コンパイル方法 まずプログラム1をコーディング、CalculatorEvent.javaで保存、 javac CalculatorEvent.javaでコンパイル。 プログラム2をコーディング、CalculatorOutput.javaで保存、 javac CalculatorOutput.javaでコンパイル。 プログラム3をコーディング、Calculator.javaで保存、 javac Calculator.javaでコンパイル。 プログラム4をコーディング、CalculatorTest.javaで保存、 javac CalculatorTest.javaでコンパイル。 MS-DOS窓でコンパイルと実行:例 java CalculatorEvent としています。 プログラム1から4の ソースファイル、クラスファイルは全て同じフォルダに格納しています。 又、iTEC JAVAプログラミングの例題も同様に、 コーディング、コンパイル、格納していて、 プログラムの実行結果を確認できています。 クラスパスは、ネット検索しましたが、 訳が分からずお手上げ状態です。 すみませんが、宜しくお願い致します。
- askaaska
- ベストアンサー率35% (1455/4149)
エラーメッセージは CalculatorクラスにeventDispatched(CalculatorEvent) メソッドはないと言っているわ。 だから実際にはないのでしょう。 もしもCalculatorクラスにきちんと eventDispatched(CalculatorEvent)があるのなら Calculatorクラスが複数あって CalculatorTestコンパイル時の クラスパスの設定が間違っていたりするんじゃないかしら? としか現在の情報からでは推測できないわね。
補足
早速のご回答をありがとうございました。 ご参考までに、 全プログラムをアップします。 //プログラム1 public class CalculatorEvent{ public static final int DIGIT = 1; public static final int OPERATOR = 2; public static final int CLEAR = 3; private int type,value; public CalculatorEvent(int type){ this(type,0); } public CalculatorEvent(int type, int value){ if(type<DIGIT || type>CLEAR) throw new IllegalArgumentException(); this.type = type; this.value = value; } public int getType() { return type;} public int getValue() { return value;} } //プログラム2 public interface CalculatorOutput{ public void display(int value); public void display(String value); } //プログラム3 public class Calculator{ private int accumulator = 0,register = 0; private int operator = 0; private CalculatorOutput output; public Calculator(CalculatorOutput output){ this.output = output; } public void eventDispached(CalculatorEvent event){ switch(event.getType()){ case CalculatorEvent.DIGIT: if(operator == '='){ register = 0; operator = 0; } register = register * 10 +event.getValue(); output.display(register); break; case CalculatorEvent.OPERATOR: try{ register = calculate(); output.display(register); accumulator = register; operator = event.getValue(); }catch(ArithmeticException e){ output.display("Error"); accumulator = 0; operator = 0; } if(operator != '=') register = 0; break; case CalculatorEvent.CLEAR: register = 0; accumulator = 0; operator = 0; output.display(register); } } private int calculate(){ switch(operator){ case '+': return accumulator + register; case '-': return accumulator - register; case '*': return accumulator * register; case '/': return accumulator / register; } return register; } } 実際は、この後にプログラム4が続いて 一つの完成プログラムとなります。 ところで、クラスパスというのがよく分かりません。 プログラム1,2,3,4、を 同一フォルダに置いて、コンパイル、classファイルを生成して実行 、する以外のファイル指定及び実行方法が有るのでしょうか? 済みませんが又、ご教授頂ければ幸いです。 宜しくお願いします。
お礼
プログラム3のコーディングミスを発見、訂正して、 ご指南通りの結果を得ました。 20ポイントしか贈呈できないことが 残念です。 又、ご教授をお願い致します。 お忙しい中、沢山の貴重なお時間を戴き、 且つご丁寧なご助言を賜り、 ありがとうございました!
補足
ご回答をありがとうございます。 >コマンドプロンプトで java -versionをした結果です。 尚、C:\Workは、ソースファイルと(classファイルの) 保存フォルダです。 C:\Work>java -version java version "1.5.0_17" Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_17-b04) Java HotSpot(TM) Client VM (build 1.5.0_17-b04, mixed mode) >いったんクラスファイルをすべて削除して、 CalculatorTest.javaのみでコンパイル した結果です。 C:\Work>javac CalculatorTest.java CalculatorTest.java:30: シンボルを見つけられません。 シンボル: メソッド eventDispatched(CalculatorEvent) 場所 : Calculator の クラス calc.eventDispatched(event); ^ エラー 1 個 と表示しました。 そして、他のファイル (Calculator.java、CalculatorOutput.java、 CalculatorEvent.java)のclassファイルは、 3つ共に、生成しませんでした。 他の3つのclassファイルの未生成の異常は、 環境変数等の設定不備?ですか? 繰返しになりますが、 iTEC JAVAプログラミングの例題は、 問題なく起動しました。 更に別の本(工学社 文系のためのJAVA入門)の 例題も問題なく起動しました。 それで何故、基本情報技術者試験問題は こうも不動なのか、キツネにつままれている感じです そこで、更に教えて欲しいのですが、 基本情報技術者試験問題は、 クラスパス等の考慮も問うているのでしょうか? (一つのフォルダにソースファイルとそのクラスファイルを 全部保存して、同じフォルダ内で>java ・・・・とやっても 起動するプログラム仕様にしていない、という事実からの推定ですが・・・) 学習書のご指南、ありがとうございます。 検討しようかと思います。 長文かつ初心者の疑問ですみません。 宜しくお願いします。