Почему моя переменная имеет значение null?

я делаю это

    package file;

    import java.io.IOException;

    import org.apache.log4j.Logger;
    import org.xml.sax.Attributes;
    import org.xml.sax.ContentHandler;
    import org.xml.sax.Locator;
    import org.xml.sax.SAXException;
    import org.xml.sax.XMLReader;
    import org.xml.sax.helpers.LocatorImpl;
    import org.xml.sax.helpers.XMLReaderFactory;

    public class GetNatureSax implements ContentHandler {

        private final static Logger _logger = Logger.getLogger(GetNatureSax.class.getName());
        private boolean isCurrentElement = false;
        private Locator locator;
        private String _parameterValue = null;

        public GetNatureSax() {
            super();
            locator = new LocatorImpl();
        }

        public String getValeurParametre() {
            return _parameterValue;
        }

        public void setDocumentLocator(Locator value) {
            locator = value;
        }

        public void startDocument() throws SAXException {}

        public void endDocument() throws SAXException {}

        public void startPrefixMapping(String prefix, String URI) throws SAXException {

        }

        public void endPrefixMapping(String prefix) throws SAXException {}

        public void startElement(String nameSpaceURI, String localName, String rawName, Attributes attributs)
        throws SAXException {
            if (localName.equals("Nature")) {
                isCurrentElement = true;
            }
        }

        public void endElement(String nameSpaceURI, String localName, String rawName) throws SAXException {

            if (localName.equals("Nature")) {
                isCurrentElement = false;
            }
        }

        public void characters(char[] ch, int start, int end) throws SAXException {
            if (isCurrentElement) {
                _parameterValue = new String(ch, start, end);
            }
        }

        public void ignorableWhitespace(char[] ch, int start, int end) throws SAXException {
            System.out.println("espaces inutiles rencontres : ..." + new String(ch, start, end) + "...");
        }

        public void processingInstruction(String target, String data) throws SAXException {
            System.out.println("Instruction de fonctionnement : " + target);
            System.out.println("  dont les arguments sont : " + data);
        }

        public void skippedEntity(String arg0) throws SAXException {}

        public void parseFichier(String i_fichierATraiter) {
            XMLReader saxReader;
            try {

                saxReader = XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser");
                saxReader.setContentHandler(new GetNatureSax());
                saxReader.parse(i_fichierATraiter);
                System.out.println(_parameterValue);
            } catch (SAXException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

Мой XML:

...

  ACHAT 
  2 
  RE 
  RE_ELECTRA 
  D 
  24 

...

почему при выполнении этой строки

<�Р> System.out.println (_parameterValue); </р>

моя переменная имеет значение null и раньше, когда я отлаживаю свою переменную не null

2
nl ja de
Из того, что я вижу, это значение null, потому что вы его нигде не устанавливаете ... За исключением символов () , но я не вижу пути кода, гарантирующего, что вы доберетесь до его печати.
добавлено автор fge, источник
также оставляйте только соответствующий код.
добавлено автор Ivaylo Strandjev, источник
Это поможет, если вы разместите только соответствующий код. Это также поможет, если вы разместите код, который использует GetNatureSax.
добавлено автор Aaron Kurtzhals, источник
это поможет использовать отладчик, чтобы найти корень проблемы
добавлено автор Luiggi Mendoza, источник
пожалуйста, удалите такие длинные комментарии, когда вы публикуете его здесь.
добавлено автор Juvanis, источник
Кстати, печать только соответствующего кода не просто помогает нам - есть очень хороший шанс, что, пройдя процесс выяснения, что такое соответствующий код, вы сами решите проблему.
добавлено автор yshavit, источник
Вы получаете содержимое тега с именем Nature . Можете ли вы показать нам свой xml тоже.
добавлено автор Alex, источник
Если вы установите точку останова (или выполните System.out.println («Я здесь») ) внутри функции characters , она достигнута? Что, если вы положите его в if? Использует ли System.out.println (_parameterValue) эту функцию для любого вывода?
добавлено автор Cynical, источник

2 ответы

Используя мой отладчик, я вижу, что вы используете два GetNatureSax

  saxReader.setContentHandler(new GetNatureSax());

Это создает второй объект GetNatureSax, где значение устанавливается.

Изменение его на

 saxReader.setContentHandler(this);

исправлена ​​проблема.

1
добавлено

Поскольку вы создаете новый GetNatureSax и передаете его в SaxReader , есть Content Handler .

Поэтому, когда разбор завершился, это новый экземпляр GetNatureSax , который был изменен и который имеет поле _parameterValue , а не текущий экземпляр ( это) .

Просто измените метод parseFichier следующим образом:

saxReader = XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser");
saxReader.setContentHandler(this); //here
saxReader.parse(i_fichierATraiter);
System.out.println("Found: " + getValeurParametre());
1
добавлено
Работает !! Спасибо ;)
добавлено автор Mercer, источник
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async