为什么在文件服务器程序套接字中写为“Socket s = null”?

时间:2012-05-23 12:42:27

标签: java tcp

在这里,我正在创建文件服务器程序。在此我已经注意到socket s = null被写入。我想知道为什么给出null的实际原因。我认为它与ObjectInputStream或Scanner.is相关它确实与ObjectInputStream或Scanner有关。这是

的代码
Server.java 

    public class Server{
public static void main(String[] args){
Socket s=null;
ServerSocket ss=null;
ObjectInputStream ois=null;
ObjectOutputStream oos=null;
Scanner sc=new Scanner(System.in);


try
    {
ss = new ServerSocket(1234);
System.out.println("server is created");

    }
catch(Exception e)
    {
System.out.println(e.getMessage());
    }



try {
s=ss.accept();
System.out.println("connected");
oos = new ObjectOutputStream(s.getOutputStream());
oos.writeObject("Welcome");
ois= new ObjectInputStream(s.getInputStream());
    }catch(Exception e)
    {
e.printStackTrace();
    }
try{
String fil=(String)ois.readObject();
FileInputStream fis = new FileInputStream(fil);
int d;
String data="";
while(true)
        {
d=fis.read();
if(d==-1)
    break;
data = data+(char)d;
        }
oos.writeObject(data);
    }
catch(Exception e)
    {
System.out.println(e.getMessage());
    }
}
}

任何人都可以解释实际原因吗?提前谢谢。

3 个答案:

答案 0 :(得分:1)

我不知道我是否理解正确,但如果您正在谈论代码的第一行,那么这是一个简单的初始化。

良好的编程习惯表明您不应该让编程语言实现初始化您的变量。即使标准规定初始值将是特定值,标准也可能发生变化,并且实现可能在某些时候出现故障。因此,您应该始终使用预期的初始值初始化变量。

对于代码,null值表示连接不存在。因此,在初始化变量时,如果尚未连接,则在表示套接字的所有对象中存储null。

我希望这会有所帮助。

答案 1 :(得分:1)

你的问题的答案是,如果将变量初始化为null,如果它们被单独声明和分配(而不是让编译器/执行环境为你初始化它们,那么这被认为是一种很好的做法。这可以追溯到早期的C除非明确设置,否则无法保证将局部变量初始化为什么值。

如果Java编译器检测到未经初始化或设置而访问变量,则生成错误。例如:

    String s;
    try {
        s = "abc";
    } catch (Exception e) {

    }
    System.out.println(s);

将在最后一行生成编译器错误,指出局部变量可能尚未初始化(因为如果try-clause在分配 s之前抛出异常,则永远不会被设定。)

在您的情况下,这似乎不是问题,因为即使您在尝试块之外声明Socket,您也不会在尝试之外访问块范围。

答案 2 :(得分:0)

据我所知,其实并非因为某种原因。但是,一般来说,它是一个很好的编码实践,以确保所有变量在使用之前都已初始化。

因此,既然您不想分配新的套接字,直到调用accept(),您只需将其指定为null。

这在这种情况下没有意义,但是如果你将未初始化的变量传递给某些地方,它仍然会产生警告。