недостатки реализации Java Android .. они задокументированы? - PullRequest
10 голосов
/ 17 июля 2011

Я играю с простым приложением для Android, используя эмулятор под управлением Android-7 (2.1) и moto-defy под управлением Android-8 (2.2).

Я столкнулся с интересной проблемой, из-за которой CSVНе удалось выполнить синтаксический анализ приложения на эмуляторе, но успешно на вызове и в обычных приложениях java (с использованием sun java).

Я обнаружил проблему, и причина в том, что реализация Android-7 StringReader не поддерживает отрицательныйоперация пропуска:

Android-7:

/**
 * Skips {@code amount} characters in the source string. Subsequent calls of
 * {@code read} methods will not return these characters unless {@code
 * reset()} is used.
 *
 * @param ns
 *            the maximum number of characters to skip.
 * @return the number of characters actually skipped or 0 if {@code ns < 0}.
 * @throws IOException
 *             if this reader is closed.
 * @see #mark(int)
 * @see #markSupported()
 * @see #reset()
 */
@Override
public long skip(long ns) throws IOException {
    synchronized (lock) {
        if (isClosed()) {
            throw new IOException(Msg.getString("K0083")); //$NON-NLS-1$
        }
        if (ns <= 0) {
            return 0;
        }
        long skipped = 0;
        if (ns < this.count - pos) {
            pos = pos + (int) ns;
            skipped = ns;
        } else {
            skipped = this.count - pos;
            pos = this.count;
        }
        return skipped;
    }
}

J2SE 1.6:

/**
 * Skips the specified number of characters in the stream. Returns
 * the number of characters that were skipped.
 *
 * <p>The <code>ns</code> parameter may be negative, even though the
 * <code>skip</code> method of the {@link Reader} superclass throws
 * an exception in this case. Negative values of <code>ns</code> cause the
 * stream to skip backwards. Negative return values indicate a skip
 * backwards. It is not possible to skip backwards past the beginning of
 * the string.
 *
 * <p>If the entire string has been read or skipped, then this method has
 * no effect and always returns 0.
 *
 * @exception  IOException  If an I/O error occurs
 */
public long skip(long ns) throws IOException {
    synchronized (lock) {
        ensureOpen();
        if (next >= length)
            return 0;
        // Bound skip by beginning and end of the source
        long n = Math.min(length - next, ns);
        n = Math.max(-next, n);
        next += n;
        return n;
    }
}

Поэтому вместо пропуска назад (анализатор использует это для предварительного чтенияв некоторых случаях - версия для Android остается на один символ вперед.

Мой вопрос: где-нибудь задокументированы различные несовместимости и отличия от спецификации J2SE?Если нет, то с какими проблемами вы, ребята, сталкиваетесь.

Спасибо, стр.

1 Ответ

1 голос
/ 17 июля 2011

Одно место для поиска - это трекер проблем Android.

Еще одно место, куда можно обратиться - это трекер Apache Harmony.

По общему признанию, использование средств отслеживания проблем будет включать поиск, а не просмотр веб-страниц тщательно классифицированных проблем. Вы могли бы думать об этом как о возможности ...


FWIW - поиск трекера проблем Harmony показывает, что было несколько проблем с поведением skip в различных потоковых классах. Одна проблема жаловалась на то, что поведение какого-то класса не соответствовало javadoc ... и было закрыто, говоря, что оно соответствует поведению RI и, следовательно, ошибка была в javadoc.

Я предполагаю, что Sun / Oracle несут большую вину за подобные вещи из-за их отказа лицензировать TCK для проекта Apache Harmony на разумных условиях.

...