проблема с StringTokenizer - PullRequest
       12

проблема с StringTokenizer

2 голосов
/ 28 февраля 2010

Я получаю следующее сообщение об ошибке и не могу понять проблему. Буду очень признателен за любую помощь. Сообщение об ошибке читается как: -

BaseStaInstance.java: 68: не удается найти символ

символ: конструктор StringTokenizer (java.lang.Object, java.lang.String)

расположение: класс java.util.StringTokenizer st = новый StringTokenizer (buf, ",");

                                  ^

Здесь BaseStaInstance - мой основной открытый класс.

Класс, реализующий этот StringTokenizer, выглядит следующим образом: -

класс ServerConnect расширяет поток {

Socket skt;
int iProcessId, iInProcessId;
int iOwnTimeStamp, iInTimeStamp;
ServerConnect scnt = null;

ObjectOutputStream myOutput;
ObjectInputStream myInput;

ServerConnect(){}
ServerConnect(Socket connection, int iProcessNo) {
    this.skt = connection;
    this.iProcessId = iProcessNo;
}

public void run() {
    try {

        //initialize the object "scnt" using the parameterized constructor
        ServerConnect scnt = new ServerConnect(skt, iProcessId);
        myInput = new ObjectInputStream(skt.getInputStream());

        while(true) {
            try{
                iOwnTimeStamp = Global.iTimeStamp;

                Object buf = myInput.readObject();

                //if we got input, print it out and write a message back to the remote client...
                if(buf != null){
                    scnt.replyChoice(buf);
                }
            }catch(ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
    } catch(IOException e) {
        e.printStackTrace();
    }
}

void replyChoice(Object buf){       
    try{
        String sDeferReply = "";
        myOutput = new ObjectOutputStream(skt.getOutputStream());

        //the place where the basestation reads the request from the other basestation
        System.out.println("Server read:[ "+buf+" ]");

        //extract out the process id and the timestamp from the incoming request
        buf = buf.toString();

        ***StringTokenizer st = new StringTokenizer(buf,",");***

        //skip the word request
        st.nextToken();
        iInProcessId = Integer.parseInt(st.nextToken());
        iInTimeStamp = Integer.parseInt(st.nextToken());

        //check request is made
        //there is a possibility of entering the else loop only on the very first iteration
        //the control flows into the if loop even if one request has been made
        if(iOwnTimeStamp != 0){
            //if the incoming request has a larger timestamp (logical clock value, process id) than the current process, we defer the reply
            if(iOwnTimeStamp < iInTimeStamp || iProcessId < iInProcessId){
                sDeferReply="iInTimeStamp"+","+"iInProcessId";
                Global.v.addElement(new String(sDeferReply));
            }
            //incoming request has a smaller timestamp than the basestation request itself
            else{
                myOutput.writeObject("Reply");
                myOutput.flush();
            }
        }
        //if the current process is in the critical section then we defer replies
        else if(Global.iCriticalSection==1){
            sDeferReply="iInTimeStamp"+","+"iInProcessId";
            Global.v.addElement(new String(sDeferReply));
        }
        //start of execution of the thread, there is a possibility that the basestation hasn't issued a request
        else{
            myOutput.writeObject("Reply");
            myOutput.flush();   
        }
    }catch(IOException e){
        e.printStackTrace();
    }
}

}

Часть, которая реализует функцию StringTokenizer, имеет *** окружающий ее.

Заранее спасибо всем, кто сможет мне помочь.

1 Ответ

4 голосов
/ 28 февраля 2010

Попробуйте

StringTokenizer st = new StringTokenizer((String) buf,",");

Причина, по которой вы получаете эту ошибку, заключается в том, что buf, ссылаясь на String в этот момент, все еще имеет тип Object.


В качестве дополнительного совета вы действительно должны попытаться понять сообщение об ошибке, выданное компилятором. Посмотрите на следующее:

cannot find symbol constructor StringTokenizer(java.lang.Object,java.lang.String)
location: class java.util.StringTokenizer st = new StringTokenizer(buf,",");

Сообщения об ошибках компилятора не всегда имеют смысл, но это так же хорошо, как и . Он говорит вам, что:

  • Найден правильный тип, java.util.StringTokenizer, так что это не import или проблема, скрывающая имя и т. Д.
  • Это говорит о том, что определенный метод с данной сигнатурой не может быть найден. Действительно, быстрая проверка с помощью API подтверждает, что StringTokenizer НЕ имеет конструктора, который принимает (java.lang.Object, java.lang.String).
  • Он сообщает в точности строку кода в вашей программе , которая пытается вызвать этот несуществующий метод. И действительно , тип вашего первого аргумента - java.lang.Object, а тип вашего второго аргумента - java.lang.String !!!

Так я смог быстро определить проблему в исходном коде и предложить быстрое решение.

Возможность обработки сообщений об ошибках, выдаваемых компилятором, необходимый навык , который вы должны развивать, поэтому я надеюсь, что это окажется для вас образовательным опытом.

...