【问题标题】:Java: how to access assignments in try-catch -loop?Java:如何在 try-catch -loop 中访问分配?
【发布时间】:2011-02-07 13:37:03
【问题描述】:

这个问题让我想到了大的 try-catch 循环。我想要更小的。那么如何访问循环中的赋值呢?

$ javac TestInit2.java 
TestInit2.java:13: variable unknown might not have been initialized
  System.out.println(unknown);
                     ^
1 error

代码

import java.util.*;
import java.io.*;

public class TestInit2 {

 public static void main(String[] args){
  String unknown;
  try{
   unknown="cannot see me, why?";
  }catch(Exception e){
   e.printStackTrace();
  }
  System.out.println(unknown);
 }
}

【问题讨论】:

  • 以后能不能直接提问而不是只贴代码?我意识到您将问题嵌入其中,但比帖子顶部或底部的一句话更难看到。谢谢!
  • 当然。但是提供一些描述性文字在这里被认为是常态。一般来说,不鼓励“单行”。

标签: java compiler-construction error-handling variable-assignment


【解决方案1】:

您需要为unknown 分配一个初始值(在这种情况下,我使用了null,但您可以随意分配对您的应用程序有意义的任何值):

import java.util.*;
import java.io.*;

public class TestInit2 {

    public static void main(String[] args){
        String unknown = null;
        try{
            unknown="cannot see me, why?";
        }catch(Exception e){
            e.printStackTrace();
        }
        System.out.println(unknown);
    }
}

由于您的赋值发生在 try 内,编译器无法验证 unknown 是否会被赋值,因此可能您可以在没有赋值的情况下使用该变量.

【讨论】:

  • 我想我会从默认值“(发生错误)”或类似的东西开始。
  • 从 catch 内部抛出异常 - 即如果异常不可恢复 - 或者在 catch 子句中设置变量值也可以解决它。
【解决方案2】:

编译器阻止你做一些很可能是错误的事情,因为在你的 try-catch 块之后,你可能会假设变量已经初始化。但是,如果抛出异常,它将不会被初始化。

在使用之前,您需要将变量分配给某个东西。但是,如果您希望它在分配失败时为 null,则可以将其分配给 null。

所以,如果你想让变量在赋值失败时为空,试试这个:

    String unknown = null;
    try{
        unknown="cannot see me, why?";
    }catch(Exception e){
        e.printStackTrace();
    }
    System.out.println(unknown);

如果您想在捕获到异常时将变量设置为其他值,请尝试以下操作:

    String unknown;
    try{
        unknown="cannot see me, why?";
    }catch(Exception e){
        e.printStackTrace();
        unknown = "exception caught";
    }
    System.out.println(unknown);        

此外,如果在赋值失败的情况下继续执行您的方法没有意义,您可能需要考虑从 catch 块返回,或者抛出另一个将被调用者捕获的异常。例如:

    String unknown;
    try{
        unknown="cannot see me, why?";
    }catch(Exception e){
        e.printStackTrace();
        //return; // if you just want to give up with this method, but not bother breaking the flow of the caller
        throw new Exception("Uh-oh...", e); // if you want to be sure the caller knows something went wrong
    }
    System.out.println(unknown);   

【讨论】:

  • 什么时候在 try-loop 中抛出异常,而不是捕获?
  • 您通常不会直接从相应的 catch 块捕获的 try 块内抛出异常,通常您在 try 块内进行的某些调用可能会抛出异常。但是,如果您想确保调用您的方法的人都知道它没有成功,那么从 catch 块中重新抛出异常可能很有用。你可以先对异常做一些事情,比如记录它,然后直接重新抛出它,或者将它包装在一个新的异常中,然后抛出那个。
【解决方案3】:

您正在“尝试”设置未初始化的变量值。这意味着如果在尝试执行该分配时捕获到异常,则该分配将不会发生并且变量将保持未初始化状态。要摆脱错误,请声明如下变量:

String unknown = null;

这样,至少 println 将能够解决一些问题。

【讨论】:

    【解决方案4】:

    在声明 unknown 时,您永远不会给它一个值,甚至 null 也不会。编译器不知道try 块中发生了什么,也不能保证里面会发生任何事情。因此,据它所知,unknown 直到您的println() 命中时才引用任何内容。

    编辑:澄清一下,编译器所知道的是,在 try 块期间的任何时候都可能引发异常,因此它不能假设您放入其中的内容会成功。

    【讨论】:

    • 是的,你应该在 try-catch 块之外初始化值,即使它只是像 null 这样的虚拟值。但实际上,这里的要点是,您不能绝对依赖于 try 或 catch 中的任何事情。
    【解决方案5】:

    编译器消息中的关键字是可能。这并不意味着在 println 调用中访问变量时无法初始化变量,只是有可能不会,因此编译器会抱怨。

    【讨论】:

      猜你喜欢
      • 2011-01-12
      • 2013-02-08
      • 2011-11-17
      • 2011-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-22
      • 1970-01-01
      相关资源
      最近更新 更多