• ベストアンサー

独習Java章末問題模範解答のソースコードがコンパイルできない

時間のある方お答えください。 -問題- 次のプログラムを作成しなさい。配列を作成し、それを5個のCharacterオブジェクトで初期化します。その後、StringBufferオブジェクトを生成し、その文字列バッファに配列要素を付加します。最後に文字列バッファを表示します。 -模範解答- class CharacterArray { public static void main(String args[]) { // 配列を作成して初期化する Character array[] = new Character[5]; array[0] = new Character('A'); array[1] = new Character('B'); array[2] = new Character('C'); array[3] = new Character('D'); array[4] = new Character('E'); // 文字列バッファを作成する StringBuffer sb = new StringBuffer(); // 配列要素をバッファに付加する sb.append(array[0]); sb.append(array[1]); sb.append(array[2]); sb.append(array[3]); sb.append(array[4]); // 文字列バッファを表示する System.out.println(sb); } } となっているのですがエラーが16個も検出されてコンパイルできないのです。 どなたか上記ソースコードを訂正してコンパイルできるようにしてください。 /* Javaは訳の分からん概念が沢山あって、どうも直感的に理解しにくいですね。 もう眠い */

質問者が選んだベストアンサー

  • ベストアンサー
  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.7

#4です。 質問等をよく見たら、前回の回答は、的はずれだったみたいです。すみません。 で、一つ気がついたのですが、 1.最初に自分で問題を解いたとき、ファイル名をStringBuffer.javaにしませんでしたか? 2.模範解答のファイル名はCharacterArray.javaではありませんか? 3.うまくいくときは、StringBuffer.javaがそのディレクトリ内に存在していないのではないですか? 上記の3つがそうなら、StringBuffer.javaを削除(あるいは拡張子をかえる)等で解決します。 何故なのかは、返事がきた後で解説します。

zyousuke
質問者

お礼

ご返信ありがとうございます。 1,2,3とも全く全くそのとおりです。 しかも、このような現象が起こるのは原因があるとのことですので是非とも、うかがっておきたいと思います。 いったい何故なんですか!?

すると、全ての回答が全文表示されます。

その他の回答 (9)

  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.10

>だから新たにディレクトリを作成して、その中に自分で作ったヘボファイルを入れて確認しました。 これは、今回の事件以後にそうしている、という意味ですよね? ディレクトリをきちんと分けてあったら、今回の事件は発生していなかったはずです。 ところで、まだ何か質問ありましたっけ?

zyousuke
質問者

お礼

ご返信ありがとうございます。 ディレクトリを作成するクセをつけないとダメですね。 ひとまず問題は解決したのですが締め切るのは、もうちょっと待ってください。 それは僕の中に質問を締め切るタイミングについての、ちょっとしたルールがあり、それに従うように決めているからです。

すると、全ての回答が全文表示されます。
  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.9

自分で作ったソースと、正解のソースを別のディレクトリに分ければいいと思います。 削除してしまうと、間違いを比較できないですからね!!

zyousuke
質問者

お礼

そうなんですよね。 だから新たにディレクトリを作成して、その中に自分で作ったヘボファイルを入れて確認しました。 しかし確認後は、もう用済みなので、やはり削除しました。 いつも小さなファイルを作っては消し、消しては作っているのでディスクが、どんどん断片化していきますね。

すると、全ての回答が全文表示されます。
  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.8

#7です。 そうですか。 また、的はずれな回答だと恥ずかしかったので・・・。 模範解答ではStringBufferというクラスを使用しています。 これは、J2SDKの標準APIにあるクラスです。 通常は、これのコンパイルには問題がないのですが、 あなたがStringBufferというクラスを自分で作成してしまい、 そのメソッドにappend等のメソッドが無いため、エラーになった訳です。 うまくいくときは、同じディレクトリ内にStringBufferというクラスが無いため、 標準APIの方が使われます。 整理すると、 *うまくいかない場合  1.CharactorArray.javaのコンパイル  2.StringBufferというクラスを発見  3.同じディレクトリ内にStringBufferクラスを発見  4.このStringBufferにappendメソッドがない  5.エラー *うまくいく場合  1.CharactorArray.javaのコンパイル  2.StringBufferというクラスを発見  3.標準APIのStringBufferを使用  4.正常終了 ということです。 従って、自分で作ったStringBufferを削除するか、拡張子をjava以外に 変えればうまくいくはずです。

zyousuke
質問者

お礼

ご回答ありがとうございます。 私が作った不正なソースは、さっさと削除すれば何事もなかったものを未練がましくとっておいたせいで大分時間をくってしまいましたね。 同じフォルダに入れておくとJavaコンパイラがよくPerlなどでサブルーチンのライブラリを参照するみたいに働いてしまうということでしょうか。 さて、ひとまず問題が解決しましたので次章に進みたいと思います。 しかし、この分厚い本、最後まで読み終えるでしょうか。 ページを開くと、とたんに眠くなるのはこの私がプログラマに向いていないから!?

すると、全ての回答が全文表示されます。
  • thelma
  • ベストアンサー率66% (20/30)
回答No.6

>>ANo.#5 >StringBuffer というクラスは、API の java.lang パッケージに最初から用意されているので、自分でさらに同じ名前のクラスを作ると、競合します。 その、3番目のソースコードの場合は、競合しません。 なぜなら、このコードではパッケージ宣言をしていないため、java.langにあるStringBufferとはパッケージが異なるからです。 パッケージ宣言をしないと、“名前のないパッケージ”に所属しているものとして扱われます。 同じパッケージ内でクラスの名前が重複してはいけませんが、パッケージが変われば問題ないのです。 (そうでないと、全世界で違う名前を付けるようにしないとダメですよね) で、この場合は、コード中では「java.lang.StringBuffer」としての動作を期待して使われているのですが、実際には別物で、“名前のないパッケージ”に属するStringBuffer、つまりここで作成しようとしたクラスそのものが使われるわけです。 ここで作成したStringBufferクラスには、appendというメソッドはありませんから、コンパイルエラーが多発します。 (通常は、importしているパッケージの複数に同じ名前のクラスがあるとコンパイルエラーが出るのですが、デフォルトパッケージの場合は異なるようです) 3番目のコードの場合、もし、sbを宣言するところを java.lang.StringBuffer sb = new java.lang.StringBuffer(); とすれば、コンパイルエラーが減るはずです。(なくなりませんが) ただ、このように混乱を招きますので、java.langパッケージにあるクラスと同じ名前のクラスは、できるだけ避けるべきでしょう。 -- で、今回のトラブルですが、Dドライブでのコンパイル時に、古いソースコードを参照しているのではないかと思います。 以前に書いたように、コンパイルエラーをみると、どう考えても古いソースコードをコンパイルしようとしているようにしか見えません。 そこで、次の内容を教えてもらえますか? ●成功するとき・失敗するときのそれぞれの、ソースコードのフルパス (例: c:\java\CharacterArray.java) ●成功するとき・失敗するときのそれぞれの、コンパイル時に入力するコマンド (例:javac CharacterArray.java)

zyousuke
質問者

お礼

ご返信ありがとうございます。 まずは予約語を一通り覚えておかないとダメですね。 おおせのとおりjava.lang.StringBuffer sb = new java.lang.StringBuffer();としたらエラーが7個にまで減少しました。 指示されました補足事項を次に示します。 成功するときのソースコードのフルパスは例えばc:\CharacterArray.javaです。 失敗するときはD:\MyDocument\Java\exercise\chapter2synthesis\3CharacterArray.javaです。 コンパイル時に入力するコマンドは成功時、失敗時ともにjavac CharacterArray.javaです。 以上より何か分かりますでしょうか。

すると、全ての回答が全文表示されます。
  • UKY
  • ベストアンサー率50% (604/1207)
回答No.5

3番目の回答に対するお礼にあるソースコードで、最初に「class StringBuffer」とあるのが気になります。 StringBuffer というクラスは、API の java.lang パッケージに最初から用意されているので、自分でさらに同じ名前のクラスを作ると、競合します。 模範解答にあるように、クラス名が StringBuffer とは異なるものになっていなければなりません。 ただ、「class StringBuffer」と書いた場合には必ずコンパイル時エラーになるはずので、コンパイルができたりできなかったりするのが私にも良く分かりません。 > ひょっとしてJavaというのはパスによってコンパイルできたり、できなかったりするのですか。 クラスパスとソースパスの設定によっては、そういうことも十分ありえます。ただ、デフォルトの設定を使用している限りは、このことで特に問題が発生することはないはずです。

zyousuke
質問者

お礼

ご回答ありがとうございます。 そうでしたかStringBufferは予約語だったのですね。 そんなことも知らずに使ってしまうとは情けない限りです。 ところでスミマセンどうも状況をうまく、お伝えできていないようです。 整理しますと私の作ったソースコードは確実にコンパイルできません。 コンパイルができたりできなかったりするのは模範解答のソースコードです。 設定は何もいじっていませんので恐らくデフォルトのままだと思います。 そういうわけですので謎は深まるばかりですね。

すると、全ての回答が全文表示されます。
  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.4

自信なしですが、 クラスパスにドライブの指定がない、ということは?

zyousuke
質問者

お礼

ご返信ありがとうございます。 言い忘れましたが私はJava歴1か月ちょっと(週3時間)の超初心者です。 スミマセンがクラスパスとは何でしょうか。 ちなみに本質問のソース以外にも、いくつかのソースを作成しました。 それらは全てDドライブに作成してあり、またコンパイル時には一切特別な操作は行っておりませんが全てコンパイルできました。 書籍:独習Javaは全16章構成なのですが本質問は第2章の章末問題なのに早くも挫折しそうな雰囲気です(汗。

すると、全ての回答が全文表示されます。
  • thelma
  • ベストアンサー率66% (20/30)
回答No.3

コンパイルしようとしたソースコードは、本当にご質問にかかれているものと全く同じですか? ご確認ください。 エラーメッセージから解釈すると、だいたい、↓のようなソースコードになっているはずです。 ----------- class StringBuffer { public static void main(string args[]) { Character array[] = new Character[5]; array[0] = 'a'; array[1] = 'b'; array[2] = 'c'; array[3] = 'd'; array[4] = 'e'; StringBuffer sb = new StringBuffer(); sb.append(array[0]); sb.append(array[1]); sb.append(array[2]); sb.append(array[3]); ab.append(array[4]); sb.append(array[0]); sb.append(array[1]); sb.append(array[2]); sb.append(array[3]); sb.append(array[4]); } }

zyousuke
質問者

お礼

ご返信ありがとうございます。 念のためさらにもう1度確認してみましたが結果は同じでした。 ソースコードはそのままコピーして使っているので間違いないと思います。 引っかかるのは全く同じファイルをCドライブに置いたときはコンパイルできDドライブに置いたときはコンパイルできないという点です。 まったくちんぷんかんぷんなトラブルです。 以下のソースコードは模範解答を参照する前に私が自力で作成したものです。 class StringBuffer { public static void main(string args[]) { Character array[] = new Character[5]; array[0] = 'a'; array[1] = 'b'; array[2] = 'c'; array[3] = 'd'; array[4] = 'e'; StringBuffer sb = new StringBuffer(); sb.append(array[0]); sb.append(array[1]); sb.append(array[2]); sb.append(array[3]); ab.append(array[4]); System.out.println(sb); } } これがコンパイルできなかったので、あきらめの早い私は早速、模範解答をコピーしコンパイルしようとした、というわけです。 この、私が作ったソースをよく見てみると今回thelmaさんにご指摘いただいたソースに、すごい似ていることに気が付きます。 これはコンパイルできないのと何か関係があるのでしょうか。 もうホント訳分かんないです。 スミマセンが何か追加情報等ございましたらよろしくお願いします。 /* カプセル化って何だ!!?? IT辞典見ても意味がサッパリ理解できん!! */

すると、全ての回答が全文表示されます。
  • asaichi
  • ベストアンサー率21% (37/171)
回答No.2

コンパイルエラーが膨大であれば、エラーの抜粋と コンパイル方法を記述していただければ、調査でき ます。

zyousuke
質問者

お礼

ご返信ありがとうございます。 エラーメッセージの内容をNo.1回答者の方の補足欄に抜粋しましたので、よろしければご覧いただけますか。 コンパイル方法は、どう説明しましょうか。 えーとWindowsXPのコマンドプロンプトからjavacコマンドでコンパイルしようとしたところ16個のエラーが検出されコンパイルできませんでした。 以上より何か思い当たる点がありましたら是非ともお知らせください。

すると、全ての回答が全文表示されます。
回答No.1

そのままコンパイルしたらうまくできましたが。実行も可能でした。どんなエラーがでているのですか。

zyousuke
質問者

お礼

ご返信ありがとうございます。 な、何ですって!? そんなことは絶対ないです。 と思いつつも再度確認してみたところ なんと、普通にコンパイルできました(汗。 しかし昨日は本当にできなかったんですって。 そういえば昨日は増設したDドライブにファイルを置いたのです。 確認のため昨日と同じDドライブにソースファイルを置いてコンパイルしようとしたところ今度はコンパイルできませんでした。 ひょっとしてJavaというのはパスによってコンパイルできたり、できなかったりするのですか。 って、そんなことはないですよね。 そこで質問ソースコードのコンパイル時に表示されるメッセージを補足しますのでご覧いただき何か思い当たる点がありましたら教えてください。

zyousuke
質問者

補足

D:\MyDocument\Java\exercise\chapter2synthesis\3>javac CharacterArray.java .\StringBuffer.java:2: シンボルを解釈処理できません。 シンボル: クラス string 位置 : StringBuffer の クラス public static void main(string args[]) { ^ CharacterArray.java:15: シンボルを解釈処理できません。 シンボル: メソッド append (java.lang.Character) 位置 : StringBuffer の クラス sb.append(array[0]); ^ CharacterArray.java:16: シンボルを解釈処理できません。 シンボル: メソッド append (java.lang.Character) 位置 : StringBuffer の クラス sb.append(array[1]); ^ CharacterArray.java:17: シンボルを解釈処理できません。 シンボル: メソッド append (java.lang.Character) 位置 : StringBuffer の クラス sb.append(array[2]); ^ CharacterArray.java:18: シンボルを解釈処理できません。 シンボル: メソッド append (java.lang.Character) 位置 : StringBuffer の クラス sb.append(array[3]); ^ CharacterArray.java:19: シンボルを解釈処理できません。 シンボル: メソッド append (java.lang.Character) 位置 : StringBuffer の クラス sb.append(array[4]); ^ .\StringBuffer.java:4: 互換性のない型 出現: char 要求: java.lang.Character array[0] = 'a'; ^ .\StringBuffer.java:5: 互換性のない型 出現: char 要求: java.lang.Character array[1] = 'b'; ^ .\StringBuffer.java:6: 互換性のない型 出現: char 要求: java.lang.Character array[2] = 'c'; ^ .\StringBuffer.java:7: 互換性のない型 出現: char 要求: java.lang.Character array[3] = 'd'; ^ .\StringBuffer.java:8: 互換性のない型 出現: char 要求: java.lang.Character array[4] = 'e'; ^ .\StringBuffer.java:10: シンボルを解釈処理できません。 シンボル: メソッド append (java.lang.Character) 位置 : StringBuffer の クラス sb.append(array[0]); ^ .\StringBuffer.java:11: シンボルを解釈処理できません。 シンボル: メソッド append (java.lang.Character) 位置 : StringBuffer の クラス sb.append(array[1]); ^ .\StringBuffer.java:12: シンボルを解釈処理できません。 シンボル: メソッド append (java.lang.Character) 位置 : StringBuffer の クラス sb.append(array[2]); ^ .\StringBuffer.java:13: シンボルを解釈処理できません。 シンボル: メソッド append (java.lang.Character) 位置 : StringBuffer の クラス sb.append(array[3]); ^ .\StringBuffer.java:14: シンボルを解釈処理できません。 シンボル: 変数 ab 位置 : StringBuffer の クラス ab.append(array[4]); ^ エラー 16 個

すると、全ての回答が全文表示されます。

関連するQ&A