2010-02-20 37 views
2

我有线条的下列顺序代码:当我在Java中声明它时,我应该为变量赋值吗?

Socket echoSocket = null; 
... something ... 
echoSocket = new Socket("taranis", 7); 

我不明白为什么我们希望有一个第一线。那么我知道Java无法从它的值中定义一个变量的类型。这就是为什么我们首先需要说明echoSocket是具有Socket类型(第一行)的变量,而echoSocket具有特定值(类Socket的对象)的高度。

但我不明白的是为什么我们需要分配一个值两次?我们为什么要说echoSocket等于null?

+2

你不需要做两次,你需要做它之前做任何事情,除了一项任务。 – Fredrik 2010-02-20 18:53:46

回答

2

你不需要为其分配一个值给本地变量是不使用的。代码应该生成直到必要时才声明变量。 JLS中有一个有点沉闷的章节。

您的问题似乎与尝试块。资源处理应该写成:

acquire(); 
try { 
    use(); 
} finally { 
    release(); 
} 

在这种情况下:

final Socket echoSocket = new Socket("taranis", 7); 
try { 
    ... something ... 
} finally { 
    echoSocket.close(); 
} 

捕获的异常应该去各地不少。不要试图保存在尝试块。

如果您发现自己重复了很多样板,请尝试执行周围成语。

1

为什么你声明变量的时间早于你对它有用的值呢?有时这是必要的,如果它要在两个不同的分支进行分配,但一般最好是等到你有一个值,并声明在一个声明中分配:

Socket echoSocket = new Socket("taranis", 7); 
+0

我有一个想法(不知道它是否好)。也许作业并不总是成功?我们试图在“try”块中使用“new Socket”(为echoSocket设置一个值),并且我们假设echoSocket有一个值。但是没有保证“新插座”的工作。所以最好在try块中的赋值之前给echoSocket赋值。只是为了确定一个价值。 – Roman 2010-02-20 19:07:18

+0

@Roman:如果套接字构造函数失败了,你是否可以继续使用你的方法? *排序*的情况是分配null的原因之一,但通常我发现我希望异常立即被重新抛出。 – 2010-02-21 07:30:40

1

你并不需要给echoSocket null的值。 (你在哪里读的?)

您可与

Socket echoSocket; 
... something ... 
echoSocket = new Socket("taranis", 7); 

去或做在同一行

... something ... 
Socket echoSocket = new Socket("taranis", 7); 

希望它可以帮助..

+0

我从这里得到了代码:http://java.sun.com/docs/books/tutorial/networking/sockets/readingWriting.html – Roman 2010-02-20 19:01:41

5

我使用的一般原则是:尽可能晚地声明一个变量。

没有为不但是初始化变量一个非常有用的情况:

String someString; 
if (/* some condition */) { 
    someString = "foo"; 
} else { 
    someString = "bar"; 
} 

因为someString是未初始化的声明如果说,在else条款没有设置值的Java编译器会抱怨未初始化值。如果你这样做,情况就不会如此:

String someString = null; 
if (/* some condition */) { 
    someString = "foo"; 
} else { 
    // do nothing 
} 

这是一个很好的理智检查。以上不是编译错误,但是这是:

String someString; 
if (/* some condition */) { 
    someString = "foo"; 
} else { 
    // do nothing 
} 
0

技术编写者并不总是编写最好的代码。

个人而言,我只在编译器告诉我时写入初始值。

相关问题