0

可能重复:
不能从静态上下文(java)引用非静态变量

编译以下java代码时出现上述错误。我是这种语言的新手,我对代码不太确定。我可以清除正常错误,但这个我不明白它是什么。请帮助我

public class Kari_Server
{


    ServerSocket server_socket=new ServerSocket(666);       
    Socket soc=server_socket.accept();
    DataInputStream data_in=new DataInputStream(soc.getInputStream());
    DataOutputStreamdata_out=newDataOutputStream(soc.getOutputStream());
    int a=1;
    int i;

    public void screen()throws Exception
    {

        Robot robo=new Robot();
        BufferedImage screen_shot=robo.createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
        ImageIO.write(screen_shot,"JPG",new File("C:\\windows\\temp\\screen_shot"+a+".jpg"));
        FileInputStream file_in=new FileInputStream("C:\\windows\\temp\\screen_shot"+a+".jpg");
        byte[] mybyte=new byte[1024];
        try
        {
            while((i=file_in.read(mybyte))>-1)
                data_out.writeUTF(mybyte,0,i);
        }
        catch(Exception e)  {}  
    }           

    public static void main(String args[])throws Exception  
    {
        Kari_Server kari=new Kari_Server();
        while(true)
        {
            String s1=" ";
            s1=data_in.readUTF();
            if(s1=="attack")
                kari.screen();
            else
                System.exit(0);
        }   
    }   
}  
4

5 回答 5

1

主要方法是静态方法。它只能从类中访问静态变量。为了访问 data_in,您需要使用已经存在的kari变量来处理它。所以,而不是

s1=data_in.readUTF();

利用

s1=kari.data_in.readUTF();

于 2013-01-27T09:40:01.007 回答
1

data_in 属于 Kari_Server 的一个实例,但 main 函数不属于。将对 data_in 的引用移动到非静态函数:

...
protected readUTF() throws Exception
{
    return data_in.readUTF();
}
public static void main(String args[]) throws Exception
{
    {
        Kari_Server kari=new Kari_Server();
        while(true)
        {
            String s1=" ";
            s1=kari.readUTF();
... 
于 2013-01-27T09:44:33.230 回答
0

我认为您的问题在于 data_in

 DataInputStream data_in=new DataInputStream(soc.getInputStream());

您在静态 void main 方法中使用该字段

  s1=data_in.readUTF();

静态方法不能访问非静态字段。

解决方案是:

  1. 将您的 data_in 更改为静态字段

    static DataInputStream data_in=new DataInputStream(soc.getInputStream());
    
  2. 或者,使用 kari 对象访问 data_in :

    kari.data_in
    
于 2013-01-27T09:41:36.463 回答
0

data_in 是 Kari_Server 类的成员字段。所以你需要通过 Kari_Server 的实例来引用它。您可以使用 kari.data_in 或为此字段创建一个 getter 并使用 kari.gatDataIn()。

于 2013-01-27T09:42:13.303 回答
0

您正在从静态的主方法调用方法和变量,因此您的方法和该方法中使用的类中的所有变量都应声明为静态。

于 2013-01-27T09:44:33.240 回答