java中的不可见对象

时间:2011-02-23 17:05:08

标签: java object reference invisible

以下代码是更大型应用程序的一部分:

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块内,否则无法找到它。为什么会这样,以后如何避免它?

5 个答案:

答案 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本身的完整性。