这个问题让我陷入了巨大的 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);
}
}
您需要为
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
是否会被赋值,因此您可能可以使用没有赋值的变量。
编译器阻止你做一些很可能是错误的事情,因为在你的 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);
您正在“尝试”设置该变量的值,该值尚未初始化。这意味着,如果在尝试执行该赋值时捕获异常,则该赋值将不会发生,并且该变量将保持未初始化状态。要消除错误,请声明变量,如下所示:
String unknown = null;
这样,至少 println 能够解决一些问题。
当你声明它时,你永远不会给
unknown
一个值,甚至是null
。 编译器不知道 try
块中发生了什么,也不能保证内部发生任何事情。 因此,据其所知,在您的 unknown
击中之前,println()
并未引用任何内容。
编辑:为了澄清,编译器所知道的是,在
try
块期间的任何点都可能抛出异常,因此它不能假设您放入其中的内容会成功。
编译器消息中的关键词是 might。这并不意味着在
println
调用中访问变量时该变量不可能被初始化,只是有可能不会被初始化,因此编译器会抱怨。