【问题标题】:Java : Catch exception of variable might not have been initializedJava:捕获变量的异常可能尚未初始化
【发布时间】:2016-05-12 00:11:44
【问题描述】:

我正在尝试创建一个递归方法(函数)。此方法正在处理另一个类的对象,该类的每个实例都有 3 个整数字段。 (整数 var1、var2、var3;)。我想知道是否存在“变量可能尚未初始化”的异常或错误,因此在这种情况下该方法将停止。起初,我以为它会抛出 nullPointerException,因为它是一个对象,但展开是自动进行的。有什么解决办法吗? (我知道这是一个编译错误...)

【问题讨论】:

  • 你的问题真的没有意义。字段默认初始化为 null(如果它们是引用类型);所以你不应该从你描述的内容中得到编译错误。 (变量可能未初始化的编译错误仅适用于局部变量和最终字段。)您可以发布您的实际代码吗?
  • 一个简单的例子:class test{ public static void main(String args[]){ Integer x; System.out.println(x); } } 类测试{ public static void main(String args[]){ Integer x = null; System.out.println(x); } } 输出 1:test.java:5: 错误:变量 x 可能没有被初始化 System.out.println(x); ^ 1 错误输出 2:null
  • 我认为他遇到了编译器错误,因为他传入的参数未初始化,并且他试图通过 try/catch 绕过该编译器错误。
  • @JAAAY:您可以并且应该编辑您的问题。
  • @ruakh 你说字段默认初始化为null,这也是我相信的。但是为什么我提到的两个例子不同呢?

标签: java recursion exception-handling try-catch


【解决方案1】:

一种方法可能是在使用它之前检查它是否是类类型的实例。考虑以下:

Integer x = null;
Integer y = new Integer(0);

if(x instanceof Integer)
    System.out.println("x is initialized.");
else
    System.out.println("x is NOT initialized.");

if(y instanceof Integer)
    System.out.println("y is initialized.");
else
    System.out.println("y is NOT initialized.");

输出结果:

x 未初始化。

y 已初始化。

【讨论】:

    【解决方案2】:

    您可以在该方法的外部范围内使用虚拟/临时值初始化所有三个变量,然后用传递给您的方法的任何内容覆盖它们。例如:

    Integer myVar1 = 0;
    Integer myVar2 = 0;
    Integer myVar3 = 0;
    public static void yourMethod(Integer var1, Integer var2, Integer var3) {
      try {
        myVar1 = var1;
        myVar2 = var2;
        myVar3 = var3;
      ... your code
      catch(NullPointerException ex) {
         // handling error code
      }
    }
    

    【讨论】:

    • 除非您需要唯一的引用,否则不要使用new Integer()
    • @Jayson 但是如何捕捉异常呢?
    • 您只需将代码包装在 try catch 中即可。如果这些变量没有在其他地方初始化,我认为你会混淆你期望什么样的错误。如果它们从未被初始化,你会得到一个编译错误,但如果你被传递一个 null 并且你正在尝试处理它,那么你会发现一个不同的错误,例如一个空指针。所以你不能做类似 var1.intValue();
    猜你喜欢
    • 2012-04-07
    • 1970-01-01
    • 2012-03-25
    • 2015-07-04
    • 1970-01-01
    相关资源
    最近更新 更多