- PR -

コンパイルエラー:シンボルを見つけられません。

1
投稿者投稿内容
crow
会議室デビュー日: 2007/02/13
投稿数: 2
投稿日時: 2007-02-13 04:10
Javaを始めたばかりで、行き詰まってしまいました。

下記のプログラムをコンパイルすると、

>javac UNoteB.java
UNoteB.java:8: シンボルを見つけられません。
シンボル: メソッド setId(NoteB,java.lang.String)
場所 : UNoteB の クラス
setId( b1, "あ0102" );
^
UNoteB.java:9: シンボルを見つけられません。
シンボル: メソッド setKakaku(NoteB,int)
場所 : UNoteB の クラス
setKakaku( b1, 440 );
^
UNoteB.java:12: シンボルを見つけられません。
シンボル: メソッド setId(NoteB,java.lang.String)
場所 : UNoteB の クラス
setId( b2, "BB101" );
^
UNoteB.java:13: シンボルを見つけられません。
シンボル: メソッド setKakaku(NoteB,int)
場所 : UNoteB の クラス
setKakaku( b2, 860 );
^
UNoteB.java:16: シンボルを見つけられません。
シンボル: メソッド printId(NoteB)
場所 : UNoteB の クラス
printId(b1);
^
UNoteB.java:17: シンボルを見つけられません。
シンボル: メソッド printKakaku(NoteB)
場所 : UNoteB の クラス
printKakaku(b1);
^
UNoteB.java:20: シンボルを見つけられません。
シンボル: メソッド printId(NoteB)
場所 : UNoteB の クラス
printId(b2);
^
UNoteB.java:21: シンボルを見つけられません。
シンボル: メソッド printKakaku(NoteB)
場所 : UNoteB の クラス
printKakaku(b2);
^
エラー 8 個

と表示されてしまいます。

どのように解決すれば良いのか教えて下さい。


NoteB.java
class NoteB{
private String id; // ID
private int kakaku; // 価格

/* IDを設定 */
void setId(NoteB b, String id){
b.id = id;
}

/* IDを取得し出力する */
void printId(NoteB b){
System.out.println(b.id);
}

/* 価格を設定 */
void setKakaku(NoteB b, int kakaku){
b.kakaku = kakaku;
}

/* 価格を取得し出力する */
void printKakaku(NoteB b){
System.out.println(b.kakaku);
}

}

UNoteB.java
class UNoteB{

void main(){
NoteB b1 = new NoteB(); // b1を作成
NoteB b2 = new NoteB(); // b2を作成

/* b1に値を設定 */
setId( b1, "あ0102" );
setKakaku( b1, 440 );

/* b2に値を設定 */
setId( b2, "BB101" );
setKakaku( b2, 860 );

/* b1を出力 */
printId(b1);
printKakaku(b1);

/* b2を出力 */
printId(b2);
printKakaku(b2);

}

}
progman
大ベテラン
会議室デビュー日: 2005/06/08
投稿数: 227
投稿日時: 2007-02-13 09:08
メッセージで指摘されているメソッドがUNoteB.javaにないからです。
2つのソースを見比べていてUNoteBがUNoteを継承すればいいのかとおもったりも
するのですが、なかなかどうしてそれだけではうまくいかないようです。
mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2007-02-13 10:31
まずはエラーメッセージをそのまま検索すること。
初心者のうちは、たいていの場合同じ状況の人の投稿を見つけられます。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-02-13 13:48
クラス、メソッドともにpublicではないからですかね。
使用しているコンパイラによってメッセージの文言が違うので
なんともいえないところですけども。
パテ太
ベテラン
会議室デビュー日: 2004/08/16
投稿数: 64
お住まい・勤務地: 千葉・東京
投稿日時: 2007-02-13 14:29
必要な部分のみ抜粋いたします。

引用:

crowさんの書き込み (2007-02-13 04:10) より:

UNoteB.java
class UNoteB{
void main(){
NoteB b1 = new NoteB(); // b1を作成
NoteB b2 = new NoteB(); // b2を作成

/* b1に値を設定 */
setId( b1, "あ0102" );
setKakaku( b1, 440 );

/* b2に値を設定 */
setId( b2, "BB101" );
setKakaku( b2, 860 );

/* b1を出力 */
printId(b1);
printKakaku(b1);

/* b2を出力 */
printId(b2);
printKakaku(b2);
}
}


『動かす』だけなら
まずmainメソッドの宣言を変更して
void main(){ ⇒ public static void main(String[] args) {

各メソッド呼び出しに対して
setId( b1, "あ0102" ); ⇒ b1.setId( b1, "あ0102" );
setKakaku( b1, 440 ); ⇒ b1.setKakaku( b1, 440 );

setId( b2, "BB101" ); ⇒ b2.setId( b2, "BB101" );
setKakaku( b2, 860 ); ⇒ b2.setKakaku( b2, 860 );

printId(b1); ⇒ b1.printId(b1);
printKakaku(b1); ⇒ b1.printKakaku(b1);

printId(b2); ⇒ b2.printId(b2);
printKakaku(b2); ⇒ b2.printKakaku(b2);

というようにそれぞれのメソッドの先頭に
b1.
または
b2.
を追加すればコンパイルは可能です。

ただし、クラスの使い方が間違ってますよ。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-02-13 17:59
あぁ、なるほど。
流し読みだったから気づかなかったけど。
根本的にクラスの概念が理解していないケースですね。

スレ主がやっていること
コード:
public class A {
    private int hoge; // インスタンス変数を宣言

    /**
     * 引数で受け取ったインスタンスにhogeの値を設定するインスタンスメソッド
     */
    setHoge(A instance, int hoge) {
        instance.hoge = hoge;
    }
}
public class Main {
    public static void main(String[] args) {
        A a = new A(); // インスタンス作成
        setHoge(a, 123); // Aのstaticなメソッドを呼ぼうとしている
    }
}



たぶん、やりたいこと
コード:
public class A {
    private int hoge;
    /**
     * thisインスタンスにhoge値を設定
     */
    public setHoge(int hoge) {
       this.hoge = hoge;
    }
}
public class Main {
    public static void main(String[] args) {
        A a1 = new A(); // インスタンス作成
        a1.setHoge(123); // a1変数に格納されたインスタンスに対してメソッドを呼び出す

        A a2 = new A(); // インスタンス作成
        a2.setHoge(234); // a2変数に格納されたインスタンスに対してメソッドを呼び出す
    }
}



インスタンスの概念を調べれば理解が深まることでしょう。
1

スキルアップ/キャリアアップ(JOB@IT)