有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在Java中声明变量时,是否应该为其赋值?

我有一个具有以下行序列的代码:

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

我不明白我们为什么想要第一条线。我知道Java无法根据变量的值定义变量的类型。这就是为什么我们首先需要告诉echoSocket是一个变量,它有socket类型(第一行),然后我们再告诉echoSocket有一个特定的值(Socket类的一个对象)

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


共 (5) 个答案

  1. # 1 楼答案

    如果未使用局部变量,则无需为其赋值。在必要之前,代码不应生成性地声明变量。JLS中有一章关于明确任务的内容有些枯燥

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

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

    在这种情况下:

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

    例外情况的捕获应在整个批次中进行。不要试图在try块上保存

    如果你发现自己重复了很多样板文件,试试“执行周围”这个成语

  2. # 2 楼答案

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

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

    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
    }
    
  3. # 3 楼答案

    您不需要给echoSocketnull值。(你在哪里读到的?)

    你可以随便选一个

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

    或者在一行中完成

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

    希望能有帮助

  4. # 4 楼答案

    技术作者并不总是写出最好的代码

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

  5. # 5 楼答案

    为什么您声明变量的时间早于它的有用值?如果要在两个不同的分支中赋值,有时这是必要的,但通常最好等到有了值,然后在一个语句中声明和赋值:

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