以下代码是更大型应用程序的一部分:
public static void METHOD_NAME(Object setName, int setLength){
tryLoop:
for( ; ; ){
try{
setName = new Stack(setLength);
break tryLoop;
}catch (InstantiationException e){
System.err.println(e.getMessage());
SET_NUM(1);
continue tryLoop;
}
}
}
每当我尝试使用在try块中初始化的堆栈对象时,除非对try块的引用在try块内,否则无法找到它。为什么会这样,以后如何避免它?
答案 0 :(得分:3)
我怀疑你的印象是:
setName = new Stack(setLength);
会对调用者传入的参数产生一些影响。它不会。无论该值是基本类型值还是引用,Java都是严格按值传递的。
换句话说,如果你这样做:
Object foo = null;
METHOD_NAME(foo, 5);
然后foo
仍然是null
。
我建议您返回您方法中的值。例如:
public static Stack METHOD_NAME(Object setName, int setLength){
while(true) {
try {
return new Stack(setLength);
} catch (InstantiationException e){
System.err.println(e.getMessage());
SET_NUM(1);
}
}
}
请注意返回而不是打破标签,while(true)
我觉得比for (; ;)
更具可读性。
答案 1 :(得分:2)
嗯,这种方法至少是非常正统的Java代码。
此外,它似乎没有任何有意义的结果。它将自己的参数设置为一个新值(完全忽略原始值),并且永远不会返回任何内容或修改它传递的任何对象。
因此,除非Stack
对象的构造具有从外部可见的某些效果,否则此方法不起作用(在“无例外”情况下)。
答案 2 :(得分:0)
Java不支持pass-by-reference,因此对setName
的赋值不会将任何值传递回调用者。
显式重写代码如下:
public static Object METHOD_NAME(int setLength) {
while (true) {
try {
return new Stack(setLength);
} catch (InstantiationException e){
System.err.println(e.getMessage());
SET_NUM(1);
}
}
}
答案 3 :(得分:0)
在try块之前声明一个方法scode变量并为其分配setName。然后将新的Stack()分配给try块中的该变量,并在方法结束时返回它。
无论如何,修改参数的值通常都是不好的做法。
答案 4 :(得分:0)
不知道你在使用什么标签 - 继续;会很好的。其他事情也有点怀疑。在try块内声明的变量的范围就是try块。设置'setName'将不会做任何事情,因为Java传递一个对象,并且将引用更改为指向一个新对象不会影响传递的对象。至于无法在当前位代码中使用setName,可以通过将其放在块外部,或者在try块中执行所需的一切来避免它:)您也可以返回它以允许调用者使用它。你为什么要抓住InstantiationException?你最好检查setLength是否有效,让未捕获的异常验证Java本身的完整性。