0

在这里,我正在创建文件服务器程序。在此我注意到写入了套接字 s=null。我想知道给出 null 的实际原因。我认为它与 ObjectInputStream 或 Scanner 有关。是真的吗与 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());
    }
}
}

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

4

3 回答 3

1

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

良好的编程实践表明您不应该让编程语言实现初始化您的变量。即使标准声明初始值将是一个特定的值,标准也可能会发生变化,并且在某些时候实现可能会出现错误。因此,您应该始终使用它们的预期初始值来初始化变量。

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

我希望这有帮助。

于 2012-05-23T12:47:28.067 回答
1

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

如果 Java 编译器检测到一个变量在没有被初始化或设置的情况下被访问,它将产生一个错误。例如:

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

    }
    System.out.println(s);

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

在您的情况下,这似乎不是问题,因为即使您Socket在 try-block 之外声明,您也永远不会在 try-block 范围之外访问它。

于 2012-05-23T12:57:44.763 回答
0

据我所知,它实际上不是因为一个原因。但是,一般来说,确保所有变量在使用之前都被初始化是一种很好的编码实践。

因此,由于您不想分配新的套接字,因此在调用 accept() 之前,您只需将其分配为 null。

这在这种情况下没有意义,但如果您将未初始化的变量传递到某个地方,它仍然会生成警告。

于 2012-05-23T12:51:30.337 回答