時間のある方お答えください。
-問題-
次のプログラムを作成しなさい。配列を作成し、それを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は訳の分からん概念が沢山あって、どうも直感的に理解しにくいですね。
もう眠い */
No.7ベストアンサー
- 回答日時:
#4です。
質問等をよく見たら、前回の回答は、的はずれだったみたいです。すみません。
で、一つ気がついたのですが、
1.最初に自分で問題を解いたとき、ファイル名をStringBuffer.javaにしませんでしたか?
2.模範解答のファイル名はCharacterArray.javaではありませんか?
3.うまくいくときは、StringBuffer.javaがそのディレクトリ内に存在していないのではないですか?
上記の3つがそうなら、StringBuffer.javaを削除(あるいは拡張子をかえる)等で解決します。
何故なのかは、返事がきた後で解説します。
ご返信ありがとうございます。
1,2,3とも全く全くそのとおりです。
しかも、このような現象が起こるのは原因があるとのことですので是非とも、うかがっておきたいと思います。
いったい何故なんですか!?
No.10
- 回答日時:
>だから新たにディレクトリを作成して、その中に自分で作ったヘボファイルを入れて確認しました。
これは、今回の事件以後にそうしている、という意味ですよね?
ディレクトリをきちんと分けてあったら、今回の事件は発生していなかったはずです。
ところで、まだ何か質問ありましたっけ?
ご返信ありがとうございます。
ディレクトリを作成するクセをつけないとダメですね。
ひとまず問題は解決したのですが締め切るのは、もうちょっと待ってください。
それは僕の中に質問を締め切るタイミングについての、ちょっとしたルールがあり、それに従うように決めているからです。
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以外に
変えればうまくいくはずです。
ご回答ありがとうございます。
私が作った不正なソースは、さっさと削除すれば何事もなかったものを未練がましくとっておいたせいで大分時間をくってしまいましたね。
同じフォルダに入れておくとJavaコンパイラがよくPerlなどでサブルーチンのライブラリを参照するみたいに働いてしまうということでしょうか。
さて、ひとまず問題が解決しましたので次章に進みたいと思います。
しかし、この分厚い本、最後まで読み終えるでしょうか。
ページを開くと、とたんに眠くなるのはこの私がプログラマに向いていないから!?
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)
ご返信ありがとうございます。
まずは予約語を一通り覚えておかないとダメですね。
おおせのとおりjava.lang.StringBuffer sb = new java.lang.StringBuffer();としたらエラーが7個にまで減少しました。
指示されました補足事項を次に示します。
成功するときのソースコードのフルパスは例えばc:\CharacterArray.javaです。
失敗するときはD:\MyDocument\Java\exercise\chapter2synthesis\3CharacterArray.javaです。
コンパイル時に入力するコマンドは成功時、失敗時ともにjavac CharacterArray.javaです。
以上より何か分かりますでしょうか。
No.5
- 回答日時:
3番目の回答に対するお礼にあるソースコードで、最初に「class StringBuffer」とあるのが気になります。
StringBuffer というクラスは、API の java.lang パッケージに最初から用意されているので、自分でさらに同じ名前のクラスを作ると、競合します。
模範解答にあるように、クラス名が StringBuffer とは異なるものになっていなければなりません。
ただ、「class StringBuffer」と書いた場合には必ずコンパイル時エラーになるはずので、コンパイルができたりできなかったりするのが私にも良く分かりません。
> ひょっとしてJavaというのはパスによってコンパイルできたり、できなかったりするのですか。
クラスパスとソースパスの設定によっては、そういうことも十分ありえます。ただ、デフォルトの設定を使用している限りは、このことで特に問題が発生することはないはずです。
ご回答ありがとうございます。
そうでしたかStringBufferは予約語だったのですね。
そんなことも知らずに使ってしまうとは情けない限りです。
ところでスミマセンどうも状況をうまく、お伝えできていないようです。
整理しますと私の作ったソースコードは確実にコンパイルできません。
コンパイルができたりできなかったりするのは模範解答のソースコードです。
設定は何もいじっていませんので恐らくデフォルトのままだと思います。
そういうわけですので謎は深まるばかりですね。
No.4
- 回答日時:
自信なしですが、
クラスパスにドライブの指定がない、ということは?
ご返信ありがとうございます。
言い忘れましたが私はJava歴1か月ちょっと(週3時間)の超初心者です。
スミマセンがクラスパスとは何でしょうか。
ちなみに本質問のソース以外にも、いくつかのソースを作成しました。
それらは全てDドライブに作成してあり、またコンパイル時には一切特別な操作は行っておりませんが全てコンパイルできました。
書籍:独習Javaは全16章構成なのですが本質問は第2章の章末問題なのに早くも挫折しそうな雰囲気です(汗。
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]);
}
}
ご返信ありがとうございます。
念のためさらにもう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辞典見ても意味がサッパリ理解できん!! */
No.2
- 回答日時:
コンパイルエラーが膨大であれば、エラーの抜粋と
コンパイル方法を記述していただければ、調査でき
ます。
ご返信ありがとうございます。
エラーメッセージの内容をNo.1回答者の方の補足欄に抜粋しましたので、よろしければご覧いただけますか。
コンパイル方法は、どう説明しましょうか。
えーとWindowsXPのコマンドプロンプトからjavacコマンドでコンパイルしようとしたところ16個のエラーが検出されコンパイルできませんでした。
以上より何か思い当たる点がありましたら是非ともお知らせください。
No.1
- 回答日時:
そのままコンパイルしたらうまくできましたが。
実行も可能でした。どんなエラーがでているのですか。この回答への補足
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 個
ご返信ありがとうございます。
な、何ですって!?
そんなことは絶対ないです。
と思いつつも再度確認してみたところ
なんと、普通にコンパイルできました(汗。
しかし昨日は本当にできなかったんですって。
そういえば昨日は増設したDドライブにファイルを置いたのです。
確認のため昨日と同じDドライブにソースファイルを置いてコンパイルしようとしたところ今度はコンパイルできませんでした。
ひょっとしてJavaというのはパスによってコンパイルできたり、できなかったりするのですか。
って、そんなことはないですよね。
そこで質問ソースコードのコンパイル時に表示されるメッセージを補足しますのでご覧いただき何か思い当たる点がありましたら教えてください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- PHP PHPの構文で間違えが分からない 5 2022/07/11 16:38
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- PHP SQLとPHPの連結方法がわからないのでアドバイスお願い致します 1 2022/07/12 12:16
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 3 2022/10/27 17:44
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 1 2022/10/27 14:21
- JavaScript 2段階プルダウンで1段階目の選択を終えた後に選択ボックスを見えなくしたい 2 2022/07/05 21:58
- PHP ファイルの書き込みについて教えて下さい。 1 2023/03/20 12:01
- C言語・C++・C# c言語について array[i]-‘0’ これってどーゆー意味ですか? (ちなみに16進数を10進数 5 2022/12/06 18:39
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
パッケージ org.gjt.mm.mysqlは...
-
.jarファイルの中身って書き換...
-
javaが文字コードの影響でコン...
-
exlipseでデバックエラーが発生...
-
「識別子がクラス名でも名前空...
-
HelloWorldのソースがコンパイ...
-
配列に対してsetText()は使えな...
-
Borland 5.5の環境設定について
-
TOMCAT_HOMEって?
-
javaの簡単なソースがコンパイ...
-
サクラエディタでjavaのプログ...
-
LaTeXでのアンダーバーの入力
-
classファイルをjavaファイルへ。
-
【Java】始めたばかりでつまづ...
-
TeXで図を挿入できません.助け...
-
javax.servlet は存在しません...
-
逆コンパイルの見方について
-
同一パッケージ内の継承について
-
Eclipse3.5EEでJavaのコンパイ...
-
antでコンパイルするとき
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
.jarファイルの中身って書き換...
-
IIS環境でJAVAを使用したい
-
javaが文字コードの影響でコン...
-
Eclipse3.5EEでJavaのコンパイ...
-
コンパイルエラーに出てくる、i...
-
サクラエディタでjavaのプログ...
-
Javaのコンパイル結果が表示さ...
-
javax.servlet は存在しません...
-
eclipseの構文エラーについて
-
javaの簡単なソースがコンパイ...
-
「識別子がクラス名でも名前空...
-
eclipseの設定のJREとコンパイ...
-
dokojavaのコンパイルについて
-
逆コンパイルの見方について
-
exlipseでデバックエラーが発生...
-
eclipseについて
-
classファイルを元に戻す
-
日本語対応 逆コンパイラについて
-
コンパイルができないのですが...
-
java サーブレットのサンプルプ...
おすすめ情報