Java 在try-catch块中初始化变量
我在Java中遇到错误: 线程“main”java.lang中出现异常。错误:未解决的编译问题Java 在try-catch块中初始化变量,java,Java,我在Java中遇到错误: 线程“main”java.lang中出现异常。错误:未解决的编译问题 局部变量b1可能尚未在Test.main(Test.java:20)处初始化 这是我的密码: import java.lang.String; public class Test { /** * @param args */ public static void main(String[] args) { // TODO Auto-generate
局部变量b1可能尚未在Test.main(Test.java:20)处初始化 这是我的密码:
import java.lang.String;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
char a[]={'s','k'};
String s0=new String(a);
String s1=new String("Amar");
String s2= "amarnath";
byte[] b1;
try{
b1=s2.getBytes("ASCII");
}
catch(Exception e){}
for(int i =0;i<s2.length();i++)
{
System.out.println(b1[i]);
}
}
}
import java.lang.String;
公开课考试{
/**
*@param args
*/
公共静态void main(字符串[]args){
//TODO自动生成的方法存根
字符a[]={'s','k'};
字符串s0=新字符串(a);
字符串s1=新字符串(“AMR”);
字符串s2=“amarnath”;
字节[]b1;
试一试{
b1=s2.getBytes(“ASCII”);
}
捕获(例外e){}
对于(inti=0;i问题
如果try
块中存在错误,则b1
将不会被初始化,其值为null
如果发生这种情况,则在尝试打印下一行中的b1
值时会出现问题:
System.out.println(b1[i]);
Java非常谨慎,不会让这种可能性发生
解决方案
使用默认值初始化b1
- 这将防止
b1
未初始化的可能性(这正是Java所担心的)
将for
循环放入try
块中(如@SashaSalauyou在评论中所说)
- 如果
try
块中的b1
初始化有错误,则该块将退出,而for
循环将不会运行。因此,不会有使用未初始化变量的代码,如前面代码行中所述
这里的问题是getBytes(字符串编码)抛出不受支持的编码异常。如果在代码中发生这种异常(如果对getBytes(“foo”)进行错误编码,则会发生这种情况)您的字节数组将保持未初始化状态。catch块将处理异常,并继续尝试使用b1的for(;;)循环。编译器发现这种可能性并抛出错误,以防止以后使用未初始化的变量。
import java.lang.String;
公开课考试{
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
char a[]={'s','k'};
String s0=new String(a);
String s1=new String("Amar");
String s2= "amarnath";
byte[] b1;
try{
b1=s2.getBytes("ASCII");
for(int i =0;i<s2.length();i++)
{
System.out.println(b1[i]);
}
}
catch(UnsupportedEncodingException uee){ //handle the excpetion or at least log it}
}
/**
*@param args
*/
公共静态void main(字符串[]args){
//TODO自动生成的方法存根
字符a[]={'s','k'};
字符串s0=新字符串(a);
字符串s1=新字符串(“AMR”);
字符串s2=“amarnath”;
字节[]b1;
试一试{
b1=s2.getBytes(“ASCII”);
对于(int i=0;i编译器会抱怨,因为如果b1
未初始化,并且如果try
块内发生错误,那么它将在以下块中使用,System.out.println(b1[i]);
,未初始化
为了使其可编译,您应该至少使用null
初始化变量,因为它是局部变量。考虑将移动到(…)
在内部尝试在b1=…
之后打印数组内容,前提是数组内容已成功初始化。现在,如果由于异常而未分配b1
,则在输入for()时,数组内容未初始化
--因此您会遇到此错误。不要接受异常。这不仅是一个很好的一般性建议,我认为它还可以解决您的具体问题。@SashaSalauyou谢谢。它起作用了。但是您能告诉我的代码为什么会出现问题吗?这是因为try范围吗?