java.lang.IllegalArgumentException: Неверный класс: класс java.lang.String - PullRequest
0 голосов
/ 19 мая 2018

Я читал о проблеме, но не могу найти, где моя ошибка.У меня есть даты в моей базе данных, и когда я получаю их и пытаюсь сравнить их с текущей датой, эта ошибка появляется в logcat:

E/AndroidRuntime: FATAL EXCEPTION: main
       Process: com.example.hpdemon.diploma, PID: 9879
       java.lang.RuntimeException: Unable to start receiver com.example.hpdemon.diploma.BroadcastManager: java.lang.IllegalArgumentException: Bad class: class java.lang.String
           at android.app.ActivityThread.handleReceiver(ActivityThread.java:2417)
           at android.app.ActivityThread.access$1700(ActivityThread.java:138)
           at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1275)
           at android.os.Handler.dispatchMessage(Handler.java:102)
           at android.os.Looper.loop(Looper.java:136)
           at android.app.ActivityThread.main(ActivityThread.java:5034)
           at java.lang.reflect.Method.invokeNative(Native Method)
           at java.lang.reflect.Method.invoke(Method.java:515)
           at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:731)
           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:565)
           at dalvik.system.NativeStart.main(Native Method)
        Caused by: java.lang.IllegalArgumentException: Bad class: class java.lang.String
           at java.text.DateFormat.format(DateFormat.java:296)
           at java.text.Format.format(Format.java:93)
           at com.example.hpdemon.diploma.BroadcastManager.onReceive(BroadcastManager.java:51)
           at android.app.ActivityThread.handleReceiver(ActivityThread.java:2410)
           at android.app.ActivityThread.access$1700(ActivityThread.java:138) 
           at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1275) 
           at android.os.Handler.dispatchMessage(Handler.java:102) 
           at android.os.Looper.loop(Looper.java:136) 
           at android.app.ActivityThread.main(ActivityThread.java:5034) 
           at java.lang.reflect.Method.invokeNative(Native Method) 

Ошибка появляется в этой строке deadline = new Date(deadline.getTime() - 604800000L); Мой код:

        Users_Database db = new Users_Database(context);
        String currentUsrname = PreferenceManager.getDefaultSharedPreferences(context).getString("USRNFORBROADCAST", "NothingFound");
        List<String> dates=db.getAllDates(db.findID(currentUsrname));
        String dateIns = "";
        String dateVin = "";
        String dateTax = "";
        // int tyres;
        dateIns=(dates.get(0));
        dateVin=(dates.get(1));
        dateTax=(dates.get(2));
        dateIns = dateIns.replaceAll("\n", "");

        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
        Calendar c = Calendar.getInstance();//текуща дата
        Date todayDate = c.getTime();
        Date deadline=c.getTime();

        try {
            todayDate = sdf.parse(sdf.format(todayDate.getTime()));
            deadline = sdf.parse(sdf.format(dateIns));
            deadline = new Date(deadline.getTime() - 604800000L);

        } catch (ParseException e) {
            e.printStackTrace();
        }
        if (todayDate.before(deadline) /*&& hour.equals(yourHour)*/) {
            Intent it = new Intent(context, BootServices.class);
            createNotification(context, it, "I Love My Car", "Краен срок!", "Изтичащ преглед");
            context.startService(it);
        }

Ответы [ 2 ]

0 голосов
/ 19 мая 2018

java.time

Это не совсем понятно из вопроса, но я думаю, что вы пытались сделать что-то вроде следующего:

    DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd/MM/uuuu");

    List<String> dates = Arrays.asList("31/05/2018", "19/06/2018", "01/07/2018");
    String dateIns = dates.get(0);
    dateIns = dateIns.replaceAll("\n", "");

    LocalDate todayDate = LocalDate.now(ZoneId.of("Pacific/Rarotonga"));
    LocalDate deadline = LocalDate.parse(dateIns, dateFormatter).minusWeeks(1);
    if (todayDate.isBefore(deadline)) {
        System.out.println("I Love My Car. Краен срок! Изтичащ преглед.");
    }

Запуск этого фрагмента только сейчас, начиная с 19-гоМай строго до 24 мая, на нем напечатано

I Love My Car.Краен срок!Изтичащ преглед.

Пожалуйста, замените желаемый часовой пояс, если это не Тихий / Раротонга.

Я использую и рекомендую java.time, современную дату на Java ивремя API.A LocalDate - это дата без времени суток, которая, кажется, подходит именно вам.И с java.time гораздо приятнее работать, чем с Date и SimpleDateFormat, которые давно устарели, и, в частности, SimpleDateFormat, как известно, хлопотно.

Если вы используете хотя бы Java 8или Android API уровня 26 или выше, вы должны убедиться, что у вас есть драйвер, совместимый с JDBC 4.2, и затем извлекать LocalDate объекты, а не строки из вашей базы данных.Таким образом, вы свободны от любого анализа строк в вашем коде, это не только проще, но и менее подвержено ошибкам.

Что пошло не так в вашем коде?

Iсчитаю, что проблема заключается в этой строке:

    deadline = sdf.parse(sdf.format(dateIns));

Здесь dateIns является String.Не имеет смысла форматировать что-то, что уже является строкой, и SimpleDateFormat не может этого сделать и поэтому выдает исключение, которое вы получили.Вы бы предпочли и, возможно, ожидали сообщение об ошибке во время компиляции при передаче неправильного типа в метод format.SimpleDateFormat наследует метод format(Date) от DateFormat, но также метод format(Object) от Format.Так что с String последний вызывается, и компилятор не может сказать, что что-то не так.

Вопрос: Могу ли я использовать java.time на Android?

Да, java.time прекрасно работает на старых и новых устройствах Android.Для этого требуется как минимум Java 6 .

  • В Java 8 и более поздних версиях и на более новых устройствах Android (от уровня API 26, как мне сказали), современный API поставляется встроенным.
  • В Java 6 и 7 получите ThreeTen Backport, бэкпорт новых классов (ThreeTen для JSR 310; см. ссылки внизу).
  • На (более старом) использовании AndroidAndroid-версия ThreeTen Backport.Это называется ThreeTenABP.И убедитесь, что вы импортируете классы даты и времени из org.threeten.bp с подпакетами.

Ссылки

0 голосов
/ 19 мая 2018

Вы не предоставили достаточно информации для точного ответа.Итак, вот несколько указателей.

Вы используете ужасные старые классы даты и времени, которые были вытеснены несколько лет назад классами java.time .

  • Instant заменено Date
  • ZonedDateTime заменено Calendar
  • DateTimeFormatter заменено SimpleDateFormat

Если вам необходимо взаимодействовать со старым кодом, который еще не обновлен для java.time , вы можете конвертировать туда и обратно, вызывая новые методы преобразования, добавленные к старым классам.

Вы используете немые строки, где вы должны использовать смарт-объекты.Начиная с JDBC 4.2, вы можете напрямую обмениваться объектами java.time с вашей базой данных.

Instant instant = myResultSet.getObject( … , Instant.class ) ;

Instant всегда в UTC.Чтобы получить дату, вы должны указать часовой пояс.В любой момент времени дата меняется по всему земному шару в зависимости от зоны.

ZoneId z = ZoneId.of( "America/Montreal" ) ; 
ZonedDateTime zdt = instant.atZone( z ) ;

Извлечение значения только для даты, по-видимому, вашей цели.

LocalDate ld = zdt.toLocalDate() ;

Сравните, позвонив isBefore и isAfter.


О java.time

Среда java.time встроена в Java 8 и более поздние версии.Эти классы вытесняют проблемные старые унаследованные классы даты и времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на классы java.time .

Чтобы узнать больше, см. Oracle Tutorial .И поиск переполнения стека для многих примеров и объяснений.Спецификация: JSR 310 .

. Вы можете обмениваться java.time объектами напрямую с вашей базой данных.Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии.Нет необходимости в строках, нет необходимости в java.sql.* классах.

Где получить классы java.time?

  • Java SE 8 , Java SE 9 , Java SE 10, а позже
    • Встроенный.
    • Часть стандартного Java API с встроенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • Большая часть функций java.time перенесена на Java 6 & 7 в ThreeTen-Backport .
  • Android
    • Более поздние версии реализации комплекта Android классов java.time.
    • Для более ранних версий Android (<26) проект <a href="https://github.com/JakeWharton/ThreeTenABP" rel="nofollow noreferrer"> ThreeTenABP адаптируется ThreeTen-Backport (упомянуто выше).См. Как использовать ThreeTenABP… .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...