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

ラベルに割り込む代わりにリターンに注意してください。ラベルwhile(true)よりも読みやすいと思いますfor (; ;)

于 2011-02-23T17:10:13.860 に答える
2

ええと、その方法は...少なくとも言うまでもなく、かなり非正統的なJavaコードです。

さらに、意味のある結果はまったく得られていないようです。独自のパラメーターを新しい値に設定し(元のパラメーターを完全に無視します)、渡されたオブジェクトを返したり、変更したりすることはありません。

したがって、Stackオブジェクトの構築が外部から見える何らかの効果を持たない限り、このメソッドは何も役に立ちません(「例外なし」の場合)。

于 2011-02-23T17:10:54.733 に答える
0

Javaは参照渡しをサポートしていないため、への割り当て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を割り当てます。次に、tryブロック内のその変数にnew Stack()を割り当て、メソッドの最後に返します。

パラメータの値を変更することは、通常、とにかく悪い習慣です。

于 2011-02-23T17:11:53.000 に答える
0

ラベルを何に使用しているのかわかりません-続行します。正常に動作します。ここでも他のことが少し疑わしいです。tryブロック内で宣言された変数のスコープは、単なるtryブロックです。'setName'を設定しても、Javaがオブジェクトを渡すときは何もしません。また、新しいオブジェクトを指すように参照を変更しても、渡されるオブジェクトには影響しません。現在のコードでsetNameを使用できない場合は、ブロックの外に出すか、tryブロック内で必要なすべてのことを行うことで回避できます:)呼び出し元が使用できるように返すこともできますそれ。なぜInstantiationExceptionをキャッチしようとしているのですか?setLengthが有効なサイズであることを確認し、キャッチされない例外でJava自体の整合性を検証することをお勧めします。

于 2011-02-23T17:12:36.667 に答える