0

下面的代码是一个更大的应用程序的一部分:

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

4

5 回答 5

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);
        }
    }
}

注意 return 而不是打破标签,while(true)我发现它比for (; ;).

于 2011-02-23T17:10:13.860 回答
2

好吧,这种方法是……至少可以说是非常非正统的 Java 代码。

此外,它似乎没有任何有意义的结果。它将自己的参数设置为一个新值(完全忽略原始参数),并且从不返回任何内容或修改它传递的任何对象。

因此,除非Stack对象的构造具有某种从外部可见的效果,否则此方法不会做任何有用的事情(在“无异常”情况下)。

于 2011-02-23T17:10:54.733 回答
0

Java 不支持按引用传递,因此对 to 的赋值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);
        }
    }
}
于 2011-02-23T17:10:59.120 回答
0

在 try 块之前声明一个方法 scode 变量并将 setName 分配给它。然后将 new Stack() 分配给 try 块中的该变量,并在方法结束时返回它。

无论如何,修改参数的值通常是不好的做法。

于 2011-02-23T17:11:53.000 回答
0

不知道你在用什么标签——继续;会正常工作。其他事情也有点可疑。在 try 块中声明的变量的作用域就是 try 块。当 Java 传递一个对象时,设置 'setName' 不会做任何事情,并且将引用更改为指向一个新对象不会影响传递的对象。至于无法在当前代码中使用 setName ,您可以通过将其带到块之外来避免它,或者在 try 块内执行您需要的所有操作:) 您也可以将其返回以允许调用者使用它。你为什么要捕捉 InstantiationException?您最好检查 setLength 是一个有效的大小,并让未捕获的异常验证 Java 本身的完整性。

于 2011-02-23T17:12:36.667 回答