【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集

java eclipse3.5を使ってプログラミングの勉強をしています。

ThreadMain.javaというプログラムを動かすのにEchoProtocolFactoryと
ThreadPerDispatcher.javaとPoolDispatcher.javaを明示的にコンパイ
ルする必要があるのです。あるサイトを見たら、【プロジェクト】ー>【すべて再ビルド】を
選択すればよいとかかれていたのでやってみたのですが、次のようなエラーが出てしまいます。

Exception in thread "main" java.lang.ClassNotFoundException: EchoProtocolFactory

これらのクラスが書かれたソースファイルはすべて同じsocket.110というパッケージに入っています。

このエラーを取り除くには、どうすればよいのでしょうか?
分かる方お願いします。

ThreadMain.javaを載せますので、アドバイスお願いします。
package socket_110;



import java.net.*; // ServerSocket
import java.io.*; // IOException


public class ThreadMain {



public static void main(String[] args) throws Exception {



if (args.length != 3) //

throw new IllegalArgumentException("Parameter(s): [<Optional properties>]"

+ " <Port> <Protocol> <Dispatcher>");



int servPort = Integer.parseInt(args[0]); //

String protocolName = args[1]; //

String dispatcherName = args[2]; //



ServerSocket servSock = new ServerSocket(servPort);

Logger logger = new ConsoleLogger(); //



ProtocolFactory protoFactory = (ProtocolFactory) //

Class.forName(protocolName + "ProtocolFactory").newInstance();



Dispatcher dispatcher = (Dispatcher) //

Class.forName(dispatcherName + "Dispatcher").newInstance();



dispatcher.startDispatching(servSock, logger, protoFactory);

}

}

A 回答 (2件)

細かい確認ですが、



> ThreadMain.javaというプログラムを動かすのにEchoProtocolFactoryと
ThreadPerDispatcher.javaとPoolDispatcher.javaを明示的にコンパイ
ルする必要があるのです。

エラーに出ているEchoProtocolFactoryだけ拡張子がないですが、ソースファイルではない、ということでしょうか? それともこれがファイル名そのものなんですか?
ファイル名に拡張子がついてない、というオチだったりしないでしょうか。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

>エラーに出ているEchoProtocolFactoryだけ拡張子がないですが、ソースファイルではない、
>ということでしょうか? それともこれがファイル名そのものなんですか?

すみません、入力ミスです。正しくは、EchoProtocolFactory.javaで、
ちゃんとしたソースファイルです。

EchoProtocolFactory.javaとThreadPerDispatcher.javaとPoolDispatcher.javaの中には、それぞれEchoProtocolFactoryクラス、ThreadPerDispatcherクラス、PoolDispatcherクラスが定義されています。

参考書には「これらのクラスは、ThreadMain.javaの中で、名前により
参照されていないので、ThreadMainと一緒に自動的にコンパイルされな
い。」とかかれています。よって、明示的にコンパイルしなくてはいけ
ないとかかれています。

socket.110というパッケージの中に、これら4つのソースファイルとこれらに関連したファイルが入っています。

socket.110
-src
--socket_110
---EchoProtocolFactory.java,ThreadPerDispatcher.java,PoolDispatcher.java,ThreadMain.java,関連しているソースファイル

EchoProtocolFactory.java、ThreadPerDispatcher.java、PoolDispatcher.javaを保存している場所がまずいのでしょうか?

お礼日時:2009/10/23 20:08

ThreadMain.javaには「package socket_110」という宣言がされていますが、他のクラスでも同じ宣言をしてありますか?


ソースファイルの配置が適切かどうかは、ThreadMain以外のクラスがどのパッケージに属しているかで決まります。他のクラスもsocket_110パッケージに属する(そういうパッケージ宣言をしてある)のであれば、配置はおそらく合っています。

> socket.110というパッケージの中に、これら4つのソースファイルとこれらに関連したファイルが入っています。

用語も確認した方がよさそうですね。このsocket.110というのはパッケージではなく、Eclipse用のプロジェクト名では? Javaのパッケージの概念とは別物なので混同しないように気を付けてください。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。知人に聞いて解決しました。次のように修正しました。

ProtocolFactory protoFactory = (ProtocolFactory) // プロトコルファクトリを取得する
Class.forName(“socket_110.” + protocolName + "ProtocolFactory").newInstance();
Dispatcher dispatcher = (Dispatcher) // ディスパッチャを取得する
Class.forName(“socket_110.” + dispatcherName + "Dispatcher").newInstance();

解答していただいた方、ありがとうございました。

お礼日時:2009/10/24 01:29

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!