Я играю с простым приложением для 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?Если нет, то с какими проблемами вы, ребята, сталкиваетесь.
Спасибо, стр.