• ベストアンサー

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

thelmaの回答

  • 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です。 以上より何か分かりますでしょうか。

関連するQ&A

  • JavaからJavascriptの配列を出力したい

    JavaからJavascriptの配列を出力したいのですが、 appendした要素を区切り文字で区切って返す方法が わかりません。 <% StringBuffer js = new StringBuffer(); js.append("1"); js.append("2"); %> Javaで↑のように格納した後に、 下記のようにJavascriptの配列を出力したいです。 if(a = 1){ val=new Array("1,"2"); }

  • StringBufferで改ページ処理を行うには?

    StringBufferに格納した文字列を、Printableで出力する処理を作成しています。 その際、StringBufferに「\n」を格納すると、改行させることが出来るのですが(例1)、 「\f」を格納して改ページをさせようと思っても、中点(・)が印字されてしまい、 上手く改ページさせることが出来ません(例2)。 StringBufferで改ページをさせるには、どうしたら宜しいのでしょうか? ※例1 【PGM】 StringBuffer sb = new StringBuffer(); sb.append("改行"); sb.append(\n); sb.append("テスト"); 【出力結果】 改行 テスト ※例2 【PGM】 StringBuffer sb = new StringBuffer(); sb.append("改ページ"); sb.append(\f); sb.append("テスト"); 【出力結果】 改ページ・テスト ※ \は実際には「バックスラッシュ」です

    • ベストアンサー
    • Java
  • 空文字ではない物のみをWHERE句にORで追加する方法

    こんばんは。 postgreSQLカテゴリに質問をしようかと考えたのですが、 こちらにさせていただきます。 タイトルの通り、空文字ではない物のみをWHERE句にORで追加する方法を教えていただきたいのです。 具体的には 検索の条件となる文字列が "" でなければ、 WHERE句に追加して、 WHERE ○○ = '■■■' OR ☆☆ = '×××' とできるように考えています。 しかし、 String ■■■ = "abc"; String ××× = "def"; StringBuffer sb = new StringBuffer(); if( !("".equals(■■■) ) ) {   sb.append(" ○○ = '");   sb.append(■■■);   sb.append("'"); } if( !("".equals(×××) ) ) {   sb.append(" OR ☆☆ = '");   sb.append(×××);   sb.append("'"); } としてしまっては、 ■■■が "" で、(上では"abc"が入っていますが空文字だと考えてください) ×××が "" ではない時に WHERE OR ☆☆ = '×××' となってしまい、ORが付いてしまいます。 どうか解決する方法はありませんでしょうか。 お教え願います。

    • ベストアンサー
    • Java
  • JAVA:toStringについて

    JAVAの"toString"について教えてください。 public synchronized String format(LogRecord record) StringBuffer sb = new StringBuffer(); sb.append(日付); sb.append(":"); sb.append(record); return sb.toString(); とした場合、StringBufferが解放されないため、メモリリーク等 発生しますでしょうか? また、回避するにはどうすればよいでしょうか? お力添えを宜しくお願いします。

  • JSPファイルの書き出し

    いつもお世話になっています。 ただ今とあるJSPファイルを呼ぶと他のJSPファイルを作成するものを作成中です。 ファイルに書き出す内容をプログラム上でStringBufferに格納しているのですが、コンパイルエラーが発生してしまっています。 StringBuffer buf = new StringBuffer(""); buf.append("if(Arrays.binarySearch(myGroup,path)){"); buf.append("\n %>\n"); この部分でエラーが発生してしまいます。 エラーの内容は 文字列が行の最後で終了していません。 buf.append("\n       ^ となっています。 何が原因なのでしょうか? どなたかご教授お願い致します。

    • ベストアンサー
    • Java
  • エラー処理について

    ファイルを引数に取って、そのファイルの中身を文字列として返す自作メソッドをウェブで見つけたので、そのまま使用しようと思いました。しかし、ファイルが空ファイルの場合はこのメソッドだとエクセプションエラーになってしまうようです。どこかを変更して、メイン側で適切に処理してあげなければならないと思われるのですが、どこをどう修正すればよいでしょうか。自分で作成したものでもないので、見当がつかない状態です。。申し訳ありませんが宜しくお願いします。 public static String fileToString(File file) throws IOException { BufferedReader br = null; try { br = new BufferedReader(new InputStreamReader(new FileInputStream(file))); StringBuffer sb = new StringBuffer(); int c; while((c=br.read())!=-1) { sb.append((char) c); } return sb.toString(); } finally { br.close(); } }

    • ベストアンサー
    • Java
  • char型からのバイト数取得

    文字列から1文字ずつバイト数を取得(判定)したいのですが、 char型の文字のバイト数を取得するスマートな方法はありますか? 今考えているのは以下のようなコードです。 String str ="あA" for(int i=0; i < str.length(); i++) { char ch = str.charAt(i); StringBuffer SB = new StringBuffer(); SB.append(c); if(SB.toString().getBytes.length == 1) { //1バイトの処理 } else { //2バイトの処理 } }

    • ベストアンサー
    • Java
  • javaというか文字列について少し質問です><

    javaというか文字列について少し質問です>< javaというか文字列について少し質問です>< お願いします。 シーザー暗号で文字列をずらすためのクラスのメソッドをつくったのですが・・・ String decrypt(String str,int key) { StringBuffer sb = new StringBuffer(); // もしくはStringBuilder for(int i=0;i<str.length();i++){ char c=str.charAt(i); c=(char)((int)c-key); sb.append( c ); } こんな感じなのですがアルファベットの小文字26文字のみとしたいので暗号化や復号化の際に越えてしまう場合はアルファベット内でループさせたいのですがいまいちやり方が浮かびません><越えてしまう場合はzからひいたものを表現させれば良いかと思いやってみたのですが全然違う文字が出てきてしまいました。何かいい方法を教えてください。お願いします><

    • ベストアンサー
    • Java
  • StringBuilderをStringに代入

    StringBuilderを使って文字列連結して、それをSQL文(String型)として利用するプログラムを作りました。 ※SQLはループ処理で約10万個ぐらい発行→実行します StringBuilderの文字列を、最終的にString型の変数(strSql)に代入するのですが、 下記のどちらで代入する方がコスト掛からないでしょうか? A案. ---------- StringBuilder sb = new StringBuilder(); sb.append(変数a); sb.append(変数b); sb.append(変数c); String sqlStr = new String(sb); ---------- B案. ---------- StringBuilder sb = new StringBuilder(); sb.append(変数a); sb.append(変数b); sb.append(変数c); String sqlStr = sb.toString(); ---------- 教えてください。

    • ベストアンサー
    • Java
  • avaというか文字列について少し質問です><

    avaというか文字列について少し質問です>< お願いします。 シーザー暗号で文字列をずらすためのクラスのメソッドをつくったのですが・・・ String decrypt(String str,int key) { StringBuffer sb = new StringBuffer(); // もしくはStringBuilder for(int i=0;i<str.length();i++){ char c=str.charAt(i); c=(char)((int)c-key); sb.append( c ); } こんな感じなのですがアルファベットの小文字26文字のみとしたいので暗号化や復号化の際に越えてしまう場合はアルファベット内でループさせたいのですがいまいちやり方が浮かびません><越えてしまう場合はzからひいたものを表現させれば良いかと思いやってみたのですが全然違う文字が出てきてしまいました。何かいい方法を教えてください。お願いします><

    • ベストアンサー
    • Java