2012-12-01 35 views
5

Tôi mới sử dụng Java và tôi đã tìm kiếm các giải pháp trên web nhưng không có cách nào hoạt động. Làm ơn giúp tôi.Nhập lớp Java tùy chỉnh

Tôi có hai tệp. Một trong số đó là tệp java chứa hàm chính. Trong đó:

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

Với lệnh đó, tôi muốn tạo một đối tượng mới VaporVisitor, mà là một lớp trong một tập tin riêng biệt gọi là VaporVisitor.java. Tuy nhiên Java không nhận ra những gì VaporVisitor được, có lẽ vì nó không biết VaporVisitor.java tồn tại (nó trong cùng một thư mục). Tôi đã cố gắng biến chúng thành một phần của cùng một gói, trong các gói khác nhau và nhập khẩu ... và tất cả chúng đều thất bại. Bất cứ ai có thể cho tôi bất kỳ hướng dẫn?

Cảm ơn!

EDIT: Dưới đây là chính xác những gì tôi đang làm và thông báo lỗi tôi nhận được: Vì vậy, tôi có 3 tệp. V2VM (với chức năng chính của tôi), VaporVisitor và một tệp jar được cung cấp có một số lớp tùy chỉnh. Tệp jar không cho tôi bất kỳ vấn đề gì; nó đang cố gắng để có được java để nhận ra VaporVisitor.

Vì vậy, trong V2VM (chức năng chính), tôi đã thử đưa vào: import V2VM.java; không hoạt động. Tôi đã thử đặt V2VM trong một thư mục con được gọi là vv, thêm package vv; vào VaporVisitor và đưa vào V2VM.java import vv.* nhưng điều đó không hoạt động.

Đối với biên dịch, tôi đã cố gắng javac -classpath [the jar file].jar V2VM.java

Các lỗi nó mang lại cho tôi:

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

Khi tôi chạy javacc Tôi đang ở cùng thư mục với V2VM, đó cũng là nơi hai tập tin khác được đặt . Tôi đã thử đặt V2VM và VaporVisitor trong cùng một gói, nhưng điều đó đã không làm việc hoặc. Vì vậy, họ không phải là một phần của bất kỳ gói bây giờ ...

EDIT 2: MÃ NGUỒN CÁC VaporVisitor và 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){ 
    ... 
} 

Đối VaporVisitor.java:

package vv; 

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

Tất cả 3 tệp nằm trong cùng một thư mục vv

+1

Bạn đang biên soạn như thế nào? (Một IDE thường sẽ sắp xếp tất cả điều này ra cho bạn, ví dụ.) –

+2

Làm thế nào để bạn biên dịch các lớp đó. Hiển thị cho chúng tôi các thư mục mà các tệp được đặt, thư mục bạn đang ở đâu và lệnh được sử dụng để biên dịch các tệp. Dán thông báo lỗi chính xác mà bạn có. Hãy cho chúng tôi biết gói nào là các lớp học. –

+0

Tôi đang sử dụng thiết bị đầu cuối và chỉ chạy 'javac'. Thật tuyệt vời nếu tôi có thể hiểu những gì tôi nên làm thay vì dựa vào IDE nếu có thể – pauliwago

Trả lời

9

OK. Vì vậy, trước hết, bạn không bao giờ tham khảo một lớp trong Java bằng cách gắn thêm .java vào tên của nó. Thứ hai: để biên dịch một lớp A sử dụng một lớp B khác, lớp B phải được biên dịch và có sẵn trong classpath. Hoặc bạn phải biên dịch cả A và B cùng một lúc.

Vì vậy, bạn nên có cấu trúc sau:

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

Cả lớp nên bắt đầu với:

package vv; 

Không cần phải nhập khẩu V2VM trong VaporVisitor hoặc ngược lại, kể từ khi họ đang ở trong cùng một gói.

Để biên dịch các tập tin, bạn sẽ có trong thư mục dự án, và sử dụng lệnh sau:

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

này sẽ biên dịch hai tập tin cùng một lúc, và đưa các tập tin lớp học biên soạn của họ trong dự án/classes:

project 
    classes 
     vv 
     V2VM.class 
     VaporVisitor.class 

Bạn đặt tệp jar vào đường dẫn lớp vì các lớp bạn biên dịch sử dụng các lớp từ tệp jar này.

Sau đó, để chạy lớp học, bạn cần có cả tệp jar và thư mục lớp trong đường dẫn lớp. Và tên đầy đủ bị quelidied của lớp chính là vv.V2VM. Vì vậy, các lệnh là

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

Nếu bạn đang ở trên cửa sổ, bạn phải sử dụng \ thay vì /, và ; thay vì :.

Nếu bạn muốn biên dịch VaporVisiotr trước, và sau đó V2VM, bạn có thể. Nhưng sau đó bạn sẽ phải làm như sau:

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

này chỉ biên dịch VaporVisiotr, và đặt tập tin lớp học trong project/classes. Sau đó, bạn cần phải biên dịch V2VM, phụ thuộc vào VaporVisitor. Vì vậy, lớp VaporVisitor đã biên dịch phải có sẵn trong classpath. Vì vậy, các lệnh là

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

Nếu bạn quyết định đặt VaporVisitor trong một gói (vv.foo chẳng hạn), sau đó bạn sẽ cần phải cấu trúc sau:

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

Các VaporVisitor.java sẽ cần phải bắt đầu với

package vv.foo; 

Và file V2VM.java sẽ cần phải có

package vv; 
import vv.foo.VaporVisitor; 

Đọc số tutorial about packages.

+0

giải thích tuyệt vời! –

Các vấn đề liên quan