Java:如何在try-catch-loop中访问分配?

Java:如何在try-catch-loop中访问分配?,java,compiler-construction,error-handling,variable-assignment,Java,Compiler Construction,Error Handling,Variable Assignment,这个问题驱使我去尝试捕捉大循环。我想要小一点的。那么如何访问循环中的分配呢 $ 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 Te

这个问题驱使我去尝试捕捉大循环。我想要小一点的。那么如何访问循环中的分配呢

$ 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);
 }
}

您需要为
unknown
指定一个初始值(在本例中,我使用了
null
,但可以随意指定对您的应用程序有意义的任何值):


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

在声明
unknown
时,您永远不会给出值,甚至
null
。编译器不知道
try
块中发生了什么,也不能保证内部发生了任何事情。因此,据它所知,
unknown
在您的
println()
点击之前不会引用任何内容

编辑:为了澄清,编译器只知道在
try
块期间的任何时候都可能抛出异常,因此它不能假设您在那里输入的内容会成功。

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

String unknown = null;

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

编译器正在阻止您执行最有可能是错误的操作,因为在try-catch块之后,您可能会假设变量已初始化。但是,如果抛出异常,它将不会被初始化

在使用变量之前,需要将其分配给某个对象。但是,如果您希望在赋值失败时将其赋值为null,则可以将其赋值为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);        
如果要在捕获异常时将变量设置为其他值,请尝试以下操作:

    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);   

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

将来,你能直接问问题而不是只发布代码吗?我知道你把问题放在那里了,但这比在文章顶部或底部的一句话更难理解。谢谢当然但提供一些描述性文本被认为是这里的标准。一般来说,“一行程序”是不可取的。我想我应该从默认值“(发生错误)”或类似的东西开始。从catch内部抛出异常(即,如果异常不可恢复)或在catch子句中设置变量值也可以解决它。对吗,您应该在try-catch块之外初始化值,即使它只是使用诸如null之类的伪值。但实际上,这里的要点是,您不能完全依赖于try或catch中发生的任何事情。什么时候您会在try循环中抛出异常,而不是catch?您通常不会直接从被相应catch块捕获的try块中抛出异常,通常,您在try块内进行的某些调用可能会引发异常。但是,如果您想确保调用您的方法的人知道它没有成功,那么从catch块中重新引用异常可能会很有用。您可以先对异常执行一些操作,例如记录它,然后直接重新引用它,或者将它包装到新的异常中并抛出该异常。