Невидимые объекты в Java - PullRequest
       102

Невидимые объекты в Java

0 голосов
/ 23 февраля 2011

Следующий код является частью более крупного приложения:

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, его невозможно найти, если ссылка на него не находится внутрипопробуй заблокировать.Почему это так и как я могу избежать этого в будущем?

Ответы [ 5 ]

3 голосов
/ 23 февраля 2011

Я подозреваю, что у вас сложилось впечатление, что это:

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 (; ;).

2 голосов
/ 23 февраля 2011

Ну, этот метод ... довольно неортодоксальный Java-код, по крайней мере.

Кроме того, похоже, что он не имеет какого-либо значимого результата. Он устанавливает свой собственный параметр в новое значение (полностью игнорируя исходное значение) и никогда не возвращает ничего или изменяет любой объект, который ему передают.

Таким образом, если конструкция объекта Stack не имеет какого-либо эффекта, видимого извне, эти методы не делают ничего полезного (в случае «без исключения»).

0 голосов
/ 23 февраля 2011

Понятия не имею, для чего вы используете ярлык - продолжить;будет работать нормальноДругие вещи немного подозрительны и здесь.Область действия для переменной, объявленной внутри блока try, является просто блоком try.Установка 'setName' ничего не изменит, поскольку Java передает объект, а изменение ссылки на новый объект не повлияет на переданный объект.Что касается невозможности использовать setName в текущем бите кода, вы можете избежать этого, вынеся его за пределы блока или выполнив все необходимое внутри блока try :) Вы также можете вернуть его, чтобы позволить вызывающей стороне использоватьЭто.Почему вы пытаетесь поймать InstantiationException?Вам лучше проверить, что setLength является допустимым размером, и пусть неперехваченные исключения проверяют целостность самой Java.

0 голосов
/ 23 февраля 2011

Объявите переменную scode метода перед вашим блоком try и присвойте ему setName.Затем назначьте новый Stack () для этой переменной в вашем блоке try и верните его в конце вашего метода.

В любом случае изменение значения параметра обычно является плохой практикой.

0 голосов
/ 23 февраля 2011

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