我正在使用java
自学套接字编程,我在编译时遇到了这个问题。我在主类Book
中声明了内部类library_s
,并且编译器无法识别类Status
中定义的变量Book
。我使用Book
作为static class
,因为我读到枚举只存在于静态类中。我想在C中使用"struct"
模拟,因为我只熟悉它。我看过其他各种类似的错误,但没有一个是有用的。请帮忙。谢谢!
public class library_s extends Thread{
private ServerSocket lib_server;
LinkedList<Book> library = new LinkedList<Book>();
//constructor
public library_s(int port) throws IOException{
lib_server = new ServerSocket(port);
lib_server.setSoTimeout(10000);
}
public void run(){
Socket server = lib_server.accept();
System.out.println("Connected to " + server.getRemoteSocketAddress());
DataInputStream is = new DataInputStream(server.getInputStream());
DataOutputStream os = new DataOutputStream(server.getOutputStream());
for(library b : library){
if(b.BookName == is.readUTF(){
if(b.Status == FORISSUE){
//enter rest of the body here
}
}
}
public static class Book{
public String BookName;
public static enum Status {FORISSUE, ISSUED, RENEW, RESERVE};
public Book(String bn){
this.BookName = bn;
this.Status = FORISSUE;
}
}
public static void main(String [] args){
int port = Integer.parseInt(args[0]);
try{
Thread t = new library_s(port);
t.start();
} catch (IOException e){
e.printStackTrace();
}
}
}
}
编译器提供错误
library_s.java:64: error: cannot find symbol
if(b.Status == FORISSUE){
^
symbol: variable Status
location: variable b of type Book
library_s.java:64: error: cannot find symbol
if(b.Status == FORISSUE){
^
答案 0 :(得分:1)
您在班级enum
内宣布了Book
,因此无法从外部(其他班级)识别。
要修复它,要么在library_s
内部或在Book
之外声明枚举,就像在包中的任何其他类一样,或者,如果你想将该枚举保留在类{{}中1}}您可以使用以下方式访问它:
Book
答案 1 :(得分:1)
您已声明类型Status
,但不是该类型的变量。
在Book
课程中:
private Status status;
public Book( ... )
{
// ...
this.status = Status.FORISSUE;
}
在课堂之外,您必须使用Book.Status
,因为它是嵌套类型。例如
if( b.status = Book.Status.FORISSUE ) { ... }
答案 2 :(得分:1)
Status
是enum
类中的嵌套Book
类型,而不是字段。您应该声明Status
类型的字段。构造函数中的赋值也是可疑的。您要为类型Status
指定值以枚举自身。那不会编译。
在Book
类中声明一个变量:
private Status status;
...并使用它:
if (b.status == Book.Status.FORISSUE)
除此之外,您还有许多其他编译错误。您的if
块如下所示缺少右括号:
if(b.BookName == is.readUTF()
此外,您正在使用==
来比较字符串,这不是编译错误,但在功能上肯定会失败。
另一件事是,您无需声明enum
static
。默认情况下,嵌套枚举仅限static
。
最后,请遵循Java命名约定。现在很难读取你的代码。类名应以UpperCase字母开头,变量名以lowerCase字母开头。
我使用Book作为静态类,因为我读到枚举只存在于静态类中。
你在哪里读到的?请引用你的消息来源。您也可以在非静态类中声明enum
。