Статическая переменная, но не gettable - проблема с загрузкой класса (возможно?)

LittleLingzi спросил: 13 июня 2018 в 05:12 в: java

Это очень странно для меня:

1) У меня есть класс

public class Data {
    private static String name;    public static String getName() {
        return name;
    }    public static void setName (String n){
        Data.name = n;
    }
}

это имя переменной класса правильно настроено во время моего сервера (запуск J2EE в WAS liberty) - я хотел кэшировать эти данные в течение всего жизненного цикла сервера.

2), но когда я ударил URL-адрес, который в конечном итоге вызывает код, который делает getter:

Data.getName(); // this returns null??

Может ли кто-нибудь подумать о возможной причине? Невозможно также отлаживать, я очень расстроен.


Чтобы проиллюстрировать мою проблему больше, позвольте мне показать мою структуру проекта:

EAR

CommonJar

WAR1 WAR2

My Data.java находится в CommonJar. Этот Data.java инициализируется в WAR1 во время запуска сервера, вызванного Listener, зарегистрированным в web.xml, и отсюда я увидел, что он установлен, и я увидел ненулевое значение, используя Data.getName (). Это мой шаг 1 в моем первоначальном сообщении.

Затем у меня есть спокойная служба HelloWorld в WAR2. И когда я звоню в эту службу HelloWorld, я вижу, что Data.getName () возвращает null. - Это мой шаг 2 в моем оригинальном посте. Даже не думайте о синтаксическом типе простой ошибки, потому что это не так.

Моя теория такова: кажется, что Data.java загружается загрузчиком классов в WAR1 на шаге 1, а затем WAR 2 в мой шаг 2 и шаг 2 загрузили пустой класс данных.

Чтобы проверить правильность этой теории, я перешел на этап инициализации Data.java в WAR2 (и снова увидел, что он установлен, и я увидел ненулевое значение, использующее Data.getName ()), разница заключается в том, что когда я звоню в эту службу HelloWorld, я видел, что Data.getName () возвращает ожидаемое ненулевое значение. Этот шаг - это то, что я называю своим прорывом в устранении неполадок, потому что, похоже, моя теория была правильной. (но я не могу исправить эту проблему, переместив код в моей реальной проблеме).

Затем возникает вопрос, как исправить и как визуально увидеть, какой класс загружен загрузчиком классов и когда? Кроме того, на основе документа WAS Liberty загрузчик по умолчанию будет иметь parentfirst, что означает, что Data.java должен быть загружен родителем (в данном случае EAR), поэтому у меня не должно быть проблем с первым местом.

Кто-нибудь, пожалуйста, подскажите, как дальше видеть проблему и исправить ее? Спасибо.


2 ответа

Chris H ответил: 13 июня 2018 в 05:40

Функция getName () объявляется без возвращаемого типа, но пытается вернуть строку.

FredK ответил: 13 июня 2018 в 05:46
Как и метод setName (), который должен быть объявлен недействительным.
LittleLingzi ответил: 13 июня 2018 в 05:48
это ошибка ввода. Он должен возвращать тип строки. Это мой первый вопрос, не знаю, как исправить эту ошибку.
LittleLingzi ответил: 13 июня 2018 в 05:51
правильно, печатать ошибку, извините за это. Но это не причина для моей проблемы
shmosel ответил: 14 июня 2018 в 07:33
Хороший момент, но не ответ.
Chirag ответил: 13 июня 2018 в 06:35

попробуйте этот

public class Data {    public static void main(String... args) {
        System.out.println("setting name 'Stack Overflow'");
        Data.setName("Stack Overflow");
        System.out.println("now getting the setted name");
        System.out.println(Data.getName());
    }    private static String name;    public static String getName() {
        return name;
    }    public static void setName(String n) {
        Data.name = n;
    }
}

Выход:

setting name 'Stack Overflow'
now getting the setted name
Stack Overflow
LittleLingzi ответил: 13 июня 2018 в 06:48
Спасибо, что пытались помочь. Ваш поток, конечно, будет работать - все это в одном java-процессе, вы его установили, и, конечно же, вы его получите. Это работает так же, как в моем шаге 1 (пока у меня была ошибка ввода). Проблема существует на моем втором этапе, когда я не могу ее решить. Ошибка более тонкая, чем кажется, и особенно мы должны думать на моем втором этапе (после запуска сервера), когда я отправил URL-запрос, который вызывает метод getter, что может быть возможно с этим классом данных, был заселен, а затем стал пустым. Я потратил более 10.
Chirag ответил: 13 июня 2018 в 07:24
вы установили значение перед его получением?
LittleLingzi ответил: 13 июня 2018 в 08:33
да, как я указал, на моем первом этапе я увидел, что он установлен, а также получил его правильно.
Chirag ответил: 13 июня 2018 в 08:35
Не могли бы вы разместить свой код сервера
Chirag ответил: 13 июня 2018 в 08:36
Откуда вы устанавливаете и получаете его на сервере.

Дополнительное видео по вопросу: Статическая переменная, но не gettable - проблема с загрузкой класса (возможно?)

Основы Java. Урок 20: Статические поля и методы класса (static)

Java SE. Урок 18. Модификатор static

Java для начинающих: Урок 26. Модификатор static