【问题标题】:non static variable data_in cannot be referenced from a static context [duplicate]不能从静态上下文中引用非静态变量 data_in [重复]
【发布时间】:2013-01-27 09:36:46
【问题描述】:

可能重复:
non-static variable cannot be referenced from a static context (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);
        }   
    }   
}  

【问题讨论】:

  • 感谢您澄清我之前的错误,现在我得到了这个,我之前忘记问了...Kari_Server.java:27: 找不到符号符号:方法 writeUTF(byte[],int,int ) 位置:类 java.io.DataOutputStream data_out.writeUTF(mybyte,0,i);也请帮助我。

标签: java


【解决方案1】:

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

s1=data_in.readUTF();

使用

s1=kari.data_in.readUTF();

【讨论】:

  • Kari_Server.java:27:找不到符号符号:方法 writeUTF(byte[],int,int) 位置:类 java.io.DataOutputStream data_out.writeUTF(mybyte,0,i);你能帮我解决这个问题吗...
  • 看来DataOutputStream 没有writeUTF 参见文档:docs.oracle.com/javase/1.4.2/docs/api/java/io/…
  • 是的,你说得对,writeUTF 不能写入数据字节,而是使用 write()。我改变了它,但现在我的初始声明从 ServerSocket=new ServerSocket(666) 到 DataOutputStream data_out =new DataOutputStream 正在抛出 unreportedException,我不知道该怎么办。您能否也澄清一下....
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    我认为你的问题在于 data_in

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

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

      s1=data_in.readUTF();
    

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

    解决办法是:

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

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

      kari.data_in
      

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 2011-05-12
          • 2013-12-02
          • 2013-12-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-17
          • 2011-11-30
          相关资源
          最近更新 更多