在这里,我正在创建文件服务器程序。在此我已经注意到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());
}
}
}
任何人都可以解释实际原因吗?提前谢谢。
答案 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。
这在这种情况下没有意义,但是如果你将未初始化的变量传递给某些地方,它仍然会产生警告。