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块中重新引用异常可能会很有用。您可以先对异常执行一些操作,例如记录它,然后直接重新引用它,或者将它包装到新的异常中并抛出该异常。