Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java初始赋值 在我过去的C++开发中,我知道用变量初始化变量是惯例。_Java_Intellij Idea - Fatal编程技术网

Java初始赋值 在我过去的C++开发中,我知道用变量初始化变量是惯例。

Java初始赋值 在我过去的C++开发中,我知道用变量初始化变量是惯例。,java,intellij-idea,Java,Intellij Idea,我把这个约定带到了Java,以及我使用的任何其他编程语言 我使用IntelliJ IDEA,我对它非常满意,并且通常遵循它的编程指南和警告,但是我得到了以下警告: public String getText(By by) { String text = null; // Variable `text` initializer `null` is redundant WebElement ele = findElement(by); highlightIfDemoMode

我把这个约定带到了Java,以及我使用的任何其他编程语言

我使用IntelliJ IDEA,我对它非常满意,并且通常遵循它的编程指南和警告,但是我得到了以下警告:

public String getText(By by) {
    String text = null; // Variable `text` initializer `null` is redundant

    WebElement ele = findElement(by);
    highlightIfDemoMode(ele);

    String tagName = ele.getTagName();
    if (tagName.equals("input")  ||
        tagName.equals("select"))
        // For field elements, the text is actually held in values, not the text.

        text = ele.getAttribute("value");
    else
        text = ele.getText();

    return text;
}
显然,在Java中

String text;
// is the *exact* same thing as..
String text = null;
考虑到IntelliJ非常擅长遵循编程约定,我是否应该忽略我的约定,不在Java中像这样初始化变量?我觉得它更干净,但如果Java惯例告诉我不要,我就不会了

有人能告诉我初始化是更好的做法吗?或者根据在第一次使用局部变量之前声明和初始化局部变量是不好的做法来推断它是空的。(我也这么认为,但我不是什么权威。)


这样做的目的是尽可能地缩小它们的范围,从而提高可读性并防止意外重复使用。

编译器的一个区别是

String text;
text.toString();
是一个编译错误

String text = null;
text.toString();
编译,但这是一个运行时错误

编译错误比运行时错误好。在获得变量值之前不声明变量比这两种方法都好,但有时是不可能的

int x;
try(SQLRunner runner = new SQLRunner(connectionPool) {
    x = runner.getX();
}
这是必要的。但是,在这种情况下,要考虑变量的最终值。无论如何,如果可能的话,这是一个很好的实践,但是我个人觉得它太冗长了,并且没有必要将每个不会更改的局部变量声明为final。这是一个例外,因为
intx告诉我它以后会改变,但不告诉我会改变多少

final int x;

以下片段是Java编译错误:

    Integer integers[] = {};
    Integer max;
    for (Integer i : integers) {
        if (max == null || i > max) max = i;
    }
Eclipse中的错误是“局部变量max可能尚未初始化”

因此,必须将max初始化为null


我想知道Intellij是怎么说的…

本地方法变量在默认情况下没有初始化,您考虑的是类字段。无论如何,我会完全消除本地
text
变量

public String getText(By by) {
  WebElement ele = findElement(by);
  highlightIfDemoMode(ele);
  String tagName = ele.getTagName();
  if (tagName.equals("input") || tagName.equals("select")) {
    return ele.getAttribute("value");
  }
  return ele.getText();
}

请注意,您可以将构造提取到一个单独的方法中,并避免这种相当丑陋的模式。@biziclop您可以将任何内容提取到一个单独的方法中,以避免任何模式(例如,对于带有中断的循环,双嵌套)。我认为不想破坏这一点是合理的,特别是如果您希望在签出连接时从顶级方法中看到它。有人告诉我,生成一个变量
final
可以让编译器/JVM进行一些它无法进行的优化,比如内联?@Stewart优化器每天都在变得更聪明,所以这并不是什么优势。拥有
final
局部变量的真正优点是不会意外地重新分配它们,并且可以在匿名内部类中引用它们。@Stewart
final
在可能的情况下是一种很好的做法。在处理高度并发的代码时,这是必要的。但它确实提高了类变量的可读性。对于函数中的局部变量,我认为这可能是多余的(不值得如此混乱),但在我看来,在上面的例子中,我会使用它。我不能谈论编译器优化,但它确实是合理的。据我所知,这不是Eclipse,而是Java编译器。(我已经很久没有用javac编译了,我可能是错的。)很可能是。Eclipse也有自己的编译器。我想知道intelliJ做什么?是的,我试着想一个例子,说明什么时候有必要,这就是其中的一次。。从其他答案来看,似乎最好的方法是不初始化。。但这些东西可能会爬起来,我喜欢东西是统一的。。如果我必须在这里做,我想在任何地方都做,我也不知道。即使在intelliJ中,如果在使用变量之前没有任何赋值,它也会给编译器带来错误。如果有人想知道太多,可以在类M{public static void main(String[]a){…}中删除上面的代码,并在上面运行javac。这是有意义的。不过,我不知道是否有一次我“意外地重复使用”了一个字段。@sircapsalot这通常是剪切和粘贴的结果,这本身就是一种不好的做法。