org.w3c.dom.Node.insertBefore: NullPointerException [дубликат]

Этот код, который я запрограммировал, намного быстрее для очень больших файлов:

public String readDoc(File f) {
    String text = "";
    int read, N = 1024 * 1024;
    char[] buffer = new char[N];

    try {
        FileReader fr = new FileReader(f);
        BufferedReader br = new BufferedReader(fr);

        while(true) {
            read = br.read(buffer, 0, N);
            text += new String(buffer, 0, read);

            if(read < N) {
                break;
            }
        }
    } catch(Exception ex) {
        ex.printStackTrace();
    }

    return text;
}
6
задан Marc 18 January 2012 в 15:06
поделиться

3 ответа

Обход. Нужно, так как ответ ljupce подтверждает, что это ошибка в более старых версиях Android.

Так как node.insertBefore(newChild, null) не работает, но совпадает с node.appendChild(newChild) , обходной путь состоит в том, чтобы просто вызвать appendChild(), если в противном случае вы бы вызвали insertBefore() с параметром null refChild.

Пример:

// Before
node.insertBefore(newChild, refChild);

// After
if (refChild != null)
    node.insertBefore(newChild, refChild);
else
    node.appendChild(newChild);
0
ответ дан Andreas 18 August 2018 в 21:34
поделиться

Он может быть воспроизведен даже с 4.1.2. Реализация для insertBefore из org.apache.harmony.xml.dom is

public Node insertBefore(Node newChild, Node refChild) throws DOMException {
    LeafNodeImpl refChildImpl = (LeafNodeImpl) refChild;

    if (refChildImpl.document != document) {
        throw new DOMException(DOMException.WRONG_DOCUMENT_ERR, null);
    }

    if (refChildImpl.parent != this) {
        throw new DOMException(DOMException.HIERARCHY_REQUEST_ERR, null);
    }

    return insertChildAt(newChild, refChildImpl.index);
}

Как вы можете видеть, никто не проверяет, является ли refChildImpl нулевым, refChildImpl.document!=document throws NullPointerException Эта реализация не имеет никакого смысла, если верно следующее

Описание org.w3c.dom.Node.insertBefore Android-SDK говорит следующее:

public abstract Node insertBefore (Node newChild, Node refChild)

Вставляет узел newChild перед существующим дочерним узлом refChild. Если refChild имеет значение null, добавьте newChild в конец списка дочерних элементов.

3
ответ дан Jacob Schoen 18 August 2018 в 21:34
поделиться

Добавьте doc!=null в оператор if. Кажется, ваш объект doc имеет значение null.

0
ответ дан Shashank Kadne 18 August 2018 в 21:34
поделиться
  • 1
    Я добавил doc! = Null, но я получаю то же исключение. Я совершенно уверен, что это ошибка, потому что весь код работает, если дать действующий Node в качестве второго параметра. Я добавлю этот doc! = Null check также в мой первоначальный пост, чтобы это стало понятным для других читателей. – Marc 17 January 2012 в 12:23
Другие вопросы по тегам:

Похожие вопросы: