views:

100

answers:

1

Hi all, I'm getting the following error message and I can't seem to figure out the problem. Would really appreciate any help. The error message reads as:-

BaseStaInstance.java:68: cannot find symbol

symbol : constructor StringTokenizer(java.lang.Object,java.lang.String)

location: class java.util.StringTokenizer st = new StringTokenizer(buf,",");

                                  ^

Here, BaseStaInstance is my main public class.

The class that implements this StringTokenizer is as follows:-

class ServerConnect extends Thread {

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();
    }
}

}

The part that implements the StringTokenizer function has * surrounding it.

Thanks in advance to anyone who might be able to help me out.

+3  A: 

Try

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

The reason why you're getting that error is because buf, while referring to a String at that point, is still of type Object.


As an additional tip, you really should make the effort to try to understand the error message given by the compiler. Look at the following:

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

Compiler error messages don't always make sense, but this is as good as it gets. It tells you that:

  • It found the right type, java.util.StringTokenizer, so it's not an import or name obscuring problem, etc.
  • It's telling you that a specific method with the given signature can not be found. Indeed, a quick check with the API confirms that StringTokenizer does NOT have a constructor that takes a (java.lang.Object, java.lang.String).
  • It's telling you exactly the line of code in your program that tries to invoke this non-existent method. And indeed, the type of your first argument is a java.lang.Object, and the type of your second argument is a java.lang.String!!!

That was how I was able to quickly pinpoint the problem in the source code and suggest a quick fix.

Being able to process error messages given by the compiler is an essential skill that you must develop, so I hope this proves to be an educational experience for you.

polygenelubricants
hey, thanks for your help, it worked. I actually tried converting buf to string using buf.toString(), but I was storing it back into buf which was of type object.
rookie
Glad to help. And since you're new, the way stackoverflow works is that if someone's answer is helpful, you vote it up to give them reputation points. That's what the arrows and checkpoint to the left of my answer is for.
polygenelubricants
oh ok. well, i tried voting up but i keep getting a message as i need 15 reputation points to be eligible. :)
rookie
OK, I just gave you 20 pts. Try again =)
polygenelubricants
You cab also mark this as being the correct answer.
Jay Askren
i'm sorry i did not vote yesterday. but i just did now, i hope i did it right...:)
rookie
Yes, thank you. I'll be glad to help again with any questions you might have in the future.
polygenelubricants