sun.misc.unsafe вызывает ClassNotFoundException в более ранних версиях Android-api - 17 [duplicate]

Я пришел сюда, просто желая простого ответа о том, как округлить число. Это дополнительный ответ, чтобы обеспечить это.

Как округлить число в Java

Наиболее распространенным случаем является использование Math.round().

Math.round(3.7) // 4

Числа округлены до ближайшего целого числа. Значение .5 округляется. Если вам нужно другое поведение округления, вы можете использовать одну из других функций Math . См. Сравнение ниже.

round

Как указано выше, это округляет до ближайшего целого числа. .5 округлые десятичные числа. Этот метод возвращает int.

Math.round(3.0); // 3
Math.round(3.1); // 3
Math.round(3.5); // 4
Math.round(3.9); // 4

Math.round(-3.0); // -3
Math.round(-3.1); // -3
Math.round(-3.5); // -3 *** careful here ***
Math.round(-3.9); // -4

ceil

Любое десятичное значение округляется до следующего целого числа. Он подходит к потолку. Этот метод возвращает значение double.

Math.ceil(3.0); // 3.0
Math.ceil(3.1); // 4.0
Math.ceil(3.5); // 4.0
Math.ceil(3.9); // 4.0

Math.ceil(-3.0); // -3.0
Math.ceil(-3.1); // -3.0
Math.ceil(-3.5); // -3.0
Math.ceil(-3.9); // -3.0

floor

Любое десятичное значение округляется до следующего целого. Этот метод возвращает значение double.

Math.floor(3.0); // 3.0
Math.floor(3.1); // 3.0
Math.floor(3.5); // 3.0
Math.floor(3.9); // 3.0

Math.floor(-3.0); // -3.0
Math.floor(-3.1); // -4.0
Math.floor(-3.5); // -4.0
Math.floor(-3.9); // -4.0

rint

Это похоже на раунд в том, что десятичные значения округляются до ближайшего целого. Однако, в отличие от round, .5 значения округляются до четного целого. Этот метод возвращает значение double.

Math.rint(3.0); // 3.0
Math.rint(3.1); // 3.0
Math.rint(3.5); // 4.0 ***
Math.rint(3.9); // 4.0
Math.rint(4.5); // 4.0 ***
Math.rint(5.5); // 6.0 ***

Math.rint(-3.0); // -3.0
Math.rint(-3.1); // -3.0
Math.rint(-3.5); // -4.0 ***
Math.rint(-3.9); // -4.0
Math.rint(-4.5); // -4.0 ***
Math.rint(-5.5); // -6.0 ***

25
задан Peter Mortensen 2 December 2009 в 21:25
поделиться

7 ответов

Недавно у меня был случай, который показал реальную проблему, с которой вы можете столкнуться, когда используете эти классы: у нас был код, который бы не компилировался, потому что метод, который он использовал на солнце. * класс просто не существовал в OpenJDK on Ubuntu. Поэтому я предполагаю, что при использовании этих классов вы больше не можете говорить такие вещи, как «это работает с Java 5», потому что он будет работать только на определенной реализации Java.

51
ответ дан Peter Mortensen 22 August 2018 в 04:21
поделиться
  • 1
    Некоторые API в com.sun.* являются экспериментальными (например, исходный APT API). IIRC, Алекс Бакли имеет блог о различных статусах этих API. Но да, в общем, они могут меняться или исчезать в выпусках обновлений и между поставщиками. – Tom Hawtin - tackline 2 December 2009 в 21:22
  • 2
    Я установил свой редактор java (IntelliJ Idea), чтобы исключить com.sun из предложений intellisense. Спасибо за ваше предложение. – skiabox 10 January 2013 в 18:52
  • 3
    Я могу настоятельно рекомендовать запуск ваших unittests на другой платформе и JVM, чем вы используете для разработки. Как правило, появляется много интересных вещей. – Thorbjørn Ravn Andersen 28 May 2013 в 11:46
[g0] Поскольку они являются внутренними API-интерфейсами: они могут быть изменены недокументированными или неподдерживаемыми способами и связаны с определенным JRE / JDK (Sun в вашем случае), что ограничивает переносимость ваших программ. [/g0] [g1] Старайтесь избегать использования таких API, всегда предпочитайте общедоступный документированный и указанный класс. [/G1]
52
ответ дан Peter Mortensen 5 November 2018 в 03:30
поделиться
  • 1
    Некоторые API под
    def import_iter():
        """ Used to return output as it is generated """
        # First return the template
        t = loader.get_template('main/qimport.htm')
        c = Context()
        yield t.render(c)
        # Now process the files
        if req.method == 'POST':
            location = req.POST['location']
            if location:
                for finfo in import_location(location):
                    yield finfo+"<br/>"
    
    return HttpResponse(import_iter())
    
    являются экспериментальными (например, оригинальный API APT). Во IIRC у Алекса Бакли есть блог о различных статусах этих API. Но да, в целом они могут изменяться или исчезать в обновлениях и между поставщиками.
    – Tom Hawtin - tackline 2 December 2009 в 21:22
  • 2
    Я установил свой Java-редактор (IntelliJ Idea), чтобы исключить com.sun из предложений intellisense. Спасибо за ваше предложение. – skiabox 10 January 2013 в 18:52

Да, потому что никто не гарантирует, что эти классы или API будут одинаковыми со следующей версией Java, и я уверен, что не гарантировано, что эти классы доступны в версиях Java от других поставщиков.

Итак, вы связываете свой код с специальной версией Java и теряете хотя бы переносимость.

7
ответ дан Andreas_D 22 August 2018 в 04:21
поделиться

Документация JDK 6 содержит ссылку под названием . Примечание. sun.* Пакеты . Это документ из документов Java 1.2, поэтому ссылки на sun.* должны обрабатываться так, как если бы они сказали com.sun.*

. Наиболее важными из них являются:

Классы, которые Sun включает в себя с Java 2 SDK, Standard Edition, попадают в группы пакетов java.*, javax.*, org.* и sun.*. Все, кроме пакетов sun.*, являются стандартной частью платформы Java и будут поддерживаться в будущем. В общем, такие пакеты, как sun.*, которые находятся за пределами платформы Java, могут быть разными на платформах ОС (Solaris, Windows, Linux, Macintosh и т. Д.) И могут быть изменены в любое время без уведомления с версиями SDK (1.2, 1.2.1, 1.2.3 и т. Д.). Программы, содержащие прямые вызовы пакетов sun.*, не являются 100% чистой Java.

и

Каждая компания, которая реализует платформу Java, сделает это по-своему. Классы из sun.* присутствуют в SDK для поддержки реализации Sun платформы Java: классы sun.* - это то, что заставляет классы платформы Java работать «под обложками» для Sun Java 2 SDK. Эти классы вообще не будут присутствовать на платформе Java другого поставщика. Если ваша Java-программа запрашивает класс «sun.package.Foo» по имени, она может завершиться неудачно с ClassNotFoundError, и вы потеряете главное преимущество разработки на Java.

20
ответ дан Powerlord 22 August 2018 в 04:21
поделиться
  • 1
    Как «несколько лет спустя», комментарий: Нет гарантии, что com.sun.* не изменится на com.oracle.*, поскольку Sun больше не существует. – Powerlord 15 October 2014 в 19:33
  • 2
    Это неправильно. Многие пакеты com.sun.* являются частью документальной спецификации. Без них невозможно было бы написать JNDI LDAP или код COSNaming. Проблема заключается в пакетах sun.*, которые представляют собой совсем другое дело и специально документированы как таковые. – user207421 1 May 2016 в 05:24
  • 3
    btw, попытка использования классов sun.* и com.sun.* неэффективно скажется на Java 9. – Powerlord 3 October 2017 в 13:45
  • 4
    Не классы com.sun.*. Они являются документированными частями Sun / Oracle JDK. – user207421 14 June 2018 в 08:30

Собственные Java-классы Sun являются частью их реализации Java, не являющейся частью Java API, их использование недокументировано и неподдерживается. Поскольку они являются внутренними, они могут быть изменены в любой момент по любой причине, которую решает команда, работающая с Sun JVM.

Также реализация Java Sun не является единственной! Ваш код не сможет переноситься в JVM от других поставщиков, таких как Oracle / BEA и IBM.

4
ответ дан Tendayi Mawushe 22 August 2018 в 04:21
поделиться

Попробуйте запустить код с помощью JVM, отличного от Sun, и посмотрите, что произойдет ...

(ваш код не будет работать с исключением ClassNotFound)

9
ответ дан Thorbjørn Ravn Andersen 22 August 2018 в 04:21
поделиться
  • 1
    Это правильное предложение идентифицировать проблему ( хотя и не является правильным ответом ). – Esko 2 December 2009 в 21:24
  • 2
    @Esko, вздох, добавил пояснительную записку ... – Thorbjørn Ravn Andersen 2 December 2009 в 23:32
  • 3
    +1 для очень практичной иллюстрации того, что большинство рассмотрит гипотетическую будущую проблему – Brian 28 May 2013 в 08:38
Другие вопросы по тегам:

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