【问题标题】:Why java is asking to initialize the variables when it is local为什么java在本地时要求初始化变量
【发布时间】:2013-10-26 22:26:20
【问题描述】:

请看下面的代码。方法 printTest() 正在打印未初始化变量的默认值,但是当涉及到 main 方法时,java 要求进行变量初始化。谁能解释一下为什么?

   public class Test1 {

    public static void main(String[] args) {   
      int j;
      String t;

      System.out.println(j);
      System.out.println(t);
    }
  }


  public class Test2 {

   int i;
   String test;

  public static void main(String[] args)   {   
    new Test().printTest();
  }

   void printTest()   {
     System.out.println(i);
     System.out.println(test);
  }

  }

【问题讨论】:

  • 在java中你需要在使用它们之前初始化变量
  • 是的,我同意。请查看代码和我的问题
  • 您希望发生什么?
  • 现在我将代码分开以便更好地理解。
  • 全局/类变量(Test2 中的变量 i)将被分配一个默认值。但是对于局部变量(Test2 类中的变量 j)我们需要分配一个初始值。

标签: java types scope type-conversion


【解决方案1】:

你必须在java中初始化局部变量。就那么简单。但是,如果您没有值,则可以将值设置为 null。注意:int 是一种简单的数据类型,不能有 null 值,因此我将类更改为“Integer”,这是无论如何都会环绕 in​​t 的类。

public class Test {

    int i;
    String test;

    public static void main(String[] args) {
        Integer j = null;
        String t = null;
        //other options for initialization value:
        t = new String();
        t = "";

        System.out.println(j);
        System.out.println(t);

        new Test().printTest();
    }

    void printTest() {
        System.out.println(i);
        System.out.println(test);
    }
}

【讨论】:

    【解决方案2】:

    局部变量主要用于中间计算,而实例变量应该携带用于未来和中间计算的数据。 Java 不强制初始化实例变量并允许默认值,但对于局部变量,开发人员调用它来分配值。所以为了避免错误,你需要初始化局部变量。

    【讨论】:

      【解决方案3】:

      Java documentation for primitives

      局部变量略有不同;编译器永远不会为未初始化的局部变量分配默认值。如果您无法在声明它的地方初始化局部变量,请确保在尝试使用它之前为其分配一个值。访问未初始化的局部变量将导致编译时错误。

      【讨论】:

        【解决方案4】:

        这是编译器所能知道的问题。

        在主方法的情况下,编译器肯定知道变量没有被初始化。

        但在 printTest 方法的情况下,编译器确实知道它可能是初始化类变量的其他方法(或同一个包类)。

        【讨论】:

          【解决方案5】:

          我认为,局部变量不会作为 JVM 类加载的一部分加载到内存中,因此没有为这些变量分配默认值。由于原语没有“空”概念,因此您应该为局部变量显式赋值。

          开放讨论!!

          【讨论】:

            【解决方案6】:

            您的全局变量未在任何地方初始化。您正在尝试打印 var i 并使用未看到/不存在的值进行测试。它不是 null 或 0 也不是空白。

            您的情况与此有点相似(来自答案:Uninitialized int vs Integer

            i == 0; Uninitialized
            i == null; Undefined
            test == 0; java.lang.NullPointerException
            test == null; Uninitialized
            

            但是当涉及到 main 方法时,java 要求进行变量初始化。

            您的局部变量 i 和 t 与全局变量的情况类似。

            变量需要初始化。我个人认为任何带变量的计算都需要有一个初始值,否则就不存在了。

            计算机目前是基于对计算/数学的物理使用,因此无论数学中的规则是什么,它也将应用于计算机,除非我们已经进入了计算量子或其他东西的新阶段。

            在数学中,变量是一个符号(通常是字母字符),用于指定一个值,该值可能会在给定问题或一组操作的范围内发生变化。

            (来自:http://en.wikipedia.org/wiki/Variable_(mathematics)

            因此,根据该规则,对我来说没有任何值的变量是不存在的空 = x 是空的,并且没有已知的计算空的方法,因为没有人可以看到它。

            【讨论】:

              【解决方案7】:

              在你的程序中,你的变量需要携带一些值,因为你在 if-else 循环中使用了变量,我可以看到如果程序转到 else 循环,没有任何内容可以显示为“sizeDisplay”,这就是为什么你的 sizeDisplay需要初始化为“null”。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2018-06-11
                • 1970-01-01
                • 2015-09-09
                相关资源
                最近更新 更多