5

I'm new to Java and I've looked around the web for solutions but none seem to work. Please help me.

I have two files. One of them is the java file that contains the main function. In it:

... VaporVisitor visitor = new VaporVisitor(); ... 

With that command, I want to create a new object VaporVisitor, which is a class in a separate file called VaporVisitor.java. However Java doesn't recognize what VaporVisitor is, presumably because it doesn't know VaporVisitor.java exists (it's in the same directory). I tried making them part of the same package, in different packages and importing...and all of them failed. Can anyone give me any guidance?

Thanks!

EDIT: Here's exactly what I'm doing, and the error message I get: So I have 3 files. V2VM (with my main function), VaporVisitor, and a provided jar file that has several custom classes. The jar file isn't giving me any problems; it's trying to get java to recognize VaporVisitor.

So in V2VM (the main function), I've tried putting in: import V2VM.java; which didn't work. I've tried putting V2VM in a subfolder called vv, added package vv; to VaporVisitor and put in V2VM.java import vv.* but that didn't work either.

For compiling, I tried javac -classpath [the jar file].jar V2VM.java

The errors it gives me:

V2VM.java:15: cannot find symbol symbol : class VaporVisitor location: class V2VM VaporVisitor visitor = new VaporVisitor(); ^ V2VM.java:15: cannot find symbol symbol : class VaporVisitor location: class V2VM VaporVisitor visitor = new VaporVisitor(); ^ 

When I run javacc I am in the same directory as V2VM, which is also where the other two files are located. I've tried putting V2VM and VaporVisitor in the same package, but that didn't work either. So they are not part of any package now...

EDIT 2: SOURCE CODE OF VaporVisitor and V2VM

V2VM.java:

package vv; //whether I put this or not, it doesn't work //this stuff was provided, and is related to importing contents of the jar file; don't think this is the problem import cs132.util.ProblemException; import cs132.vapor.parser.VaporParser; import cs132.vapor.ast.VaporProgram; import cs132.vapor.ast.VBuiltIn.Op; import java.io.InputStreamReader; import java.io.IOException; import java.io.PrintStream; import vv.VaporVisitor; //whether I put this or not, it doesn't work public class V2VM{ public static void main(String [] args){ VaporProgram vp = parseVapor(System.in, System.err); VaporVisitor visitor = new VaporVisitor(); for(int i=0; i<vp.functions.length; i++){ for(int j=0; j<vp.functions[i].body.length; j++){ vp.functions[i].body[j].accept(parameter, visitor); } } } public static VaporProgram parseVapor(InputStream in, PrintStream err){ ... } 

For VaporVisitor.java:

package vv; public class VaporVisitor extends VInstr.VisitorPR<Parameter_Type, Return_Type, RuntimeException>{ .... } 

All 3 files are in the same directory vv

11
  • 1
    How are you compiling? (An IDE would normally sort all of this out for you, for example.) Commented Dec 1, 2012 at 8:32
  • 2
    How do you compile those classes. Show us thedirectories where the files are placed, the directory where you are, and the command used to compile the files. Paste the exact error message you have. Tell us in which package the classes are. Commented Dec 1, 2012 at 8:33
  • I'm actually using the terminal and just running javac. It'd be great if I could understand what I should be doing instead of relying on the IDE if possible Commented Dec 1, 2012 at 8:34
  • The directory and the package must match. Anyway, are you sure that VaporVisitor is compiling correctly? Commented Dec 1, 2012 at 8:34
  • 1
    Edit your question, and answer every question I asked. Commented Dec 1, 2012 at 8:35

1 Answer 1

10

OK. So first of all, you never refer to a class in Java by appending .java to its name. Second: in order to compile a class A that uses another class B, the class B must be compiled, and available in the classpath. Or you must compile both A and B at the same time.

So, you should have the following structure:

project lib someFile.jar src vv V2VM.java VaporVisitor.java classes 

Both classes should start with:

 package vv; 

There's no need to import V2VM in VaporVisitor or vice versa, since they are in the same package.

To compile the files, you should be in the project directory, and use the following command:

javac -cp lib/someFile.jar -d classes src/vv/V2VM.java src/vv/VaporVisitor.java 

This will compile the two files at once, and put their compiled class files in project/classes:

project classes vv V2VM.class VaporVisitor.class 

You put the jar file in the classpath because the classes you compile use classes from this jar file.

Then, to run your class, you need to have both the jar file, and the classes directory in the classpath. And the fully qualified name of the main class is vv.V2VM. So the command is

java -cp lib/someFile.jar:classes vv.V2VM 

If you're on windows, you must use \ instead of /, and ; instead of :.

If you wanted to compile VaporVisiotr first, and then V2VM, you could. But then you would have to do the following:

javac -cp lib/someFile.jar -d classes src/vv/VaporVisitor.java 

This compiles VaporVisiotr only, and put its class file in project/classes. Then you need to compile V2VM, which depends on VaporVisitor. So the compiled VaporVisitor class must be available in the classpath. So the command is

javac -cp lib/someFile.jar:classes -d classes src/vv/V2VM.java 

If you decided to put VaporVisitor in another package (vv.foo for example), then you would need the following structure:

project lib someFile.jar src vv V2VM.java foo VaporVisitor.java classes 

The VaporVisitor.java would need to start with

package vv.foo; 

And the V2VM.java file would need to have

package vv; import vv.foo.VaporVisitor; 

Read the tutorial about packages.

Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.