こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

同一パッケージにあるクラスが見つからないエラー

Tomcatとeclipseを用いてjspによるウェブアプリ開発の勉強をしているものです。

tagsrch.java内のメソッドに、同一パッケージ(フォルダ名:mangasearch)内のmangalist.javaで定義したmangaクラスというクラスを使いたいのですが、以下のように、シンボルが見つけられないというエラーが出てしまいます。

C:\(中略)\mangasearch>javac tagsrch.java
tagsrch.java:11: エラー: シンボルを見つけられません
public static List<manga> searchByKey(String k[]) throws IOException{
^
シンボル: クラス manga
場所: クラス tagsrch
tagsrch.java:14: エラー: シンボルを見つけられません
manga[] list = new manga[cnum];


同一パッケージ内に置かれている以上、tagsrch.javaにおいてmangaクラスが使えるはずだと思います。
ですが、いろいろなサイトを参考にして試してもmangaクラスが見つからないまま、tagsrch.javaがコンパイルできません。

初歩的質問で申し訳ありませんが、よろしくお願いいたします。


-参考-
1.いろいろ試したこと
 1-1.カレントディレクトリを保存している場所より1つ上の場所でコンパイルする。
 eclipseでtomcatプロジェクトを作成したため、どのクラスファイルにもpackage mangasearch;が含まれていました。なので1-1.を行い「javac パッケージ名/ファイル名」でコンパイルしてみました。

 1-2.クラスパスを入れてコンパイルしてみる。
 同一パッケージ内なので、この必要はないはずですが、
 C:\(中略)\mangasearch>javac -classpath C:\(中略)\mangasearchでコンパイルしてみました。
 
下記のURLを参考にこの対策を講じましたが、エラーは変わりませんでした。
 1-1.1-2.の参考URL:http://okwave.jp/qa/q2520327.html

 1-3.メソッドをmangalist.java(mangaクラス)上で定義してしまう。
 分割をあきらめ、tagsrch.java上のメソッドをmangalist.javaのmangaクラス上に定義してみました。
publicつけたままだと、
C:\(中略)\mangasearch>javac mangalist.java
mangalist.java:76: エラー: クラスtagsrchはpublicであり、ファイルtagsrch.javaで宣
言する必要があります

となったため、publicをとりました。するとコンパイルは出来ましたが、おそらく異なるパッケージからは使えないクラスとなったため、jsp上でアクセスできないというエラーが発生しました。
org.apache.jasper.JasperException: javax.servlet.ServletException: java.lang.IllegalAccessError: mangasearch/tagsrch

このため、分割してtagsrch.javaを宣言する必要があり、1-3.の対策では最初にあげたmangaクラスを認識する問題に帰着すると思われます。


2.mangalist.java/tagsrch.javaについて
mangalist.javaのコンパイルはできています。
mangalist.javaは、ただ単にmangaクラスとそれに付随するフィールド、コンストラクタを記述しただけのファイルです。

■mangalist.java
package mangasearch;
class manga{
フィールド名
・・・
   manga(){
   //コンストラクタ
   }
}

■tagsrch.java
public class tagsrch extends manga{
メソッド{
    }
}

投稿日時 - 2012-02-15 04:03:44

QNo.7305989

すぐに回答ほしいです

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

> 1-2.クラスパスを入れてコンパイルしてみる。
>  同一パッケージ内なので、この必要はないはずですが、
>  C:\(中略)\mangasearch>javac -classpath C:\(中略)\mangasearchでコンパイルしてみました。

javacでコンパイルするなら、
classpath/パッケージ/クラス
と探すので、これだと、
C:\(中略)\mangasearch/mangasearch/manga.class
を探しにいっちゃいますよ。
classpathに指定するディレクトリを、もう1つ上の階層にしてみてください。

eclipseとjavacとどっちを使いたいのはわからないのですが、
eclipseなら
プロジェクト名/src/mangasearch/mangalist.java
プロジェクト名/src/mangasearch/tagsrch.java
になってますか?

投稿日時 - 2012-02-16 09:31:49

お礼

ありがとうございます!プロジェクトディレクトリを以下に移し、classpathに指定するディレクトリを、もう1つ上の階層にしたら、無事コンパイルできました!

投稿日時 - 2012-02-17 03:27:59

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

mangalist.javaにあるmangalistクラスは、mangasearchパッケージに入っていますが、
tagsrchクラスは、package宣言が無いので、デフォルトパッケージですよね?
同じディレクトリにあれば同じパッケージって訳ではありませんので注意。


mangaクラスの宣言で、スコープが定義されていないので、mangaクラスはパッケージプライベートになります。
パッケージプライベートは、同じパッケージからは参照できるスコープです。
ですから、そのままでは、tagsrchクラスとは別のパッケージなので、参照できません。


方法1:
mangaクラスのスコープをpublicにする。
・パブリックなクラス名は、コンパイラの規則により、ファイル名と同じでなければならない(大文字小文字の区別を含めて)ってルールがあるので、更にファイル名をmanga.javaにする必要がある

方法2
tagsrchクラスをmangasearchパッケージに移動する。

あと、クラス名は先頭大文字、あとは区切りを大文字ってのが一般的なルールなので
Mangaクラス、TagSrchクラスの方が良いと思う。
Srchじゃわかりづらいので、TagSearchに方がもっと良いと思います。

投稿日時 - 2012-02-15 11:53:28

補足

早速のご回答、本当に感謝です!
今はパソコンがないのでできませんが、すぐ試してみます!

書き忘れていて申し訳ないのですが、tagsrchクラスにはpackage宣言がなされています。

投稿日時 - 2012-02-15 13:52:02

お礼

色々ご教授頂きありがとうございます。とても勉強になりました!

方法1、方法2、方法1+方法2を行ってみましたが、エラーは変わりませんでした。。
eclipse上のエラーチェックでもエラーはないのですが、、、どうしてなんでしょう(汗。

投稿日時 - 2012-02-15 20:25:24

あなたにオススメの質問