2014-02-15 40 views
3

我的问题很简单:我需要从另一个类访问变量history(它在类BinaryServer中声明)。我使用更多的类来运行此代码。它只是简单的客户端和服务器客户端发送到服务器二进制代码/文本和服务器将其翻译成文本/二进制代码并将其发回给客户端。如果需要,我可以提供所有类。访问另一个类的静态变量

BinaryServer类

import java.net.*; 
import java.util.ArrayList; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.io.*; 
import graphics.gui; 

public class BinaryServer extends gui implements ActionListener,Runnable 
{ 
private ServerSocket server; 
private Socket client; 
public String text; 
private BufferedReader reader; 
public static ArrayList<String> history; 


public static String binary_letter; 
public static String[] letter; 
public static int i; 
public static String[] binary; 
public static String sendback; 


public static void main(String[] args)throws IOException 
{ 
    BinaryServer instance=new BinaryServer(); 

    gui.buildframe(310,360,"Binary translator server"); 
    gui.buildpane(300,300,true); 
    gui.buildbutton(300,20,"Translate"); 
    instance.server(63400); 
} 

public void server(int port)throws IOException 
{ 
    history=new ArrayList<String>(100); 
    server=new ServerSocket(port); 
    button.addActionListener(this); 

    while(true) 
    { 
     client=server.accept(); 
     reader=new BufferedReader(new InputStreamReader(client.getInputStream())); 
     text=reader.readLine(); 
     history.add(text); 
     message.setText(message.getText()+"\n"+text+": "); 
    } 
} 

@Override 
public void actionPerformed(ActionEvent e) 
{ 
    Thread response=new Thread(new BinaryServer()); 

    if(text.contains("0")) 
    { 
     int length=text.length(); 
     letter=new String[length+1]; 
     sendback=""; 
     int begin=-8; 
     int end=0; 

     for(i=1;i<=length/8;i++) 
     { 
      begin=begin+8; 
      end=i*8; 
      binary_letter=text.substring(begin,end); 
      Libary.translate(); 
      message.setText(message.getText()+letter[i]); 
      sendback=sendback+letter[0+i]; 
     } 
    } 
    else 
    { 
     int length=text.length(); 
     letter=new String[length+1]; 
     binary=new String[length+1]; 
     sendback=""; 

     for(i=1;i<=length;i++) 
     { 
      letter[i]=text.substring(i-1,i); 
      Libary.encode(); 
      message.setText(message.getText()+binary[i]); 
      sendback=sendback+binary[0+i]; 
     } 
    } 
    response.start(); 
} 

public void run() 
{ 
    try 
    { 
    Socket feedback=new Socket("localhost",63403); 

    PrintWriter writer=new PrintWriter(feedback.getOutputStream(),true); 
    writer.println(sendback); 
    feedback.close(); 
    return; 
    } 
    catch(IOException exc) 
    { 
     System.out.println(""); 
    } 
} 
} 

BinaryHistory类(一个我想从访问变量)

public class BinaryHistory 
{ 
    public static void main(String[] args) 
    { 
     show(); 
    } 
    public static void show() 
    { 
     System.out.println(BinaryServer.history); 
} 

当我从类BinaryHistory访问变量history,这是送花儿给人空值。

+0

你访问之前调用服务器中的任何地方?服务器方法似乎初始化它 –

+0

我看到2主要在这里,并没有istanstiation的服务器类。 – Dima

+0

我在eclipse中工作,它在相同的环境中。即使在扩展类BinaryServer之后,变量仍然为空。 –

回答

1

如果您只有声明该变量,无论类型或它是否是静态的,它将得到a default value of null

你必须初始化变量太多:

public static ArrayList<String> history = new ArrayList<>(); 
+1

有行'历史=新ArrayList (100);'在code.Isn't它初始化? (在方法服务器中) –

+0

不在静态上下文中,否。如果稍后在方法中重新分配,则在调用方法时分配其值。 – Makoto

+0

是否需要删除提到的行? –