Путь к коду Android Studio 3.0 всегда выполняется, даже если исключение не выбрано внутри try [duplicate]

Для каждой даты введите неделю года, к которой она принадлежит, форматируя ее с помощью format(), используя %U заполнителей формата %W. %U рассматривает воскресенье как первый день недели, тогда как %W считает понедельник первым днем ​​недели. Вот пример:

now <- as.Date(Sys.time())
dates <- seq(now, now + 25, by = "1 day") 

dat <- data.frame(Dates = dates, Week = format(dates, format = "%W"))
head(dat, 10)

Который дает:

> head(dat, 10)
        Dates Week
1  2011-11-06   44
2  2011-11-07   45
3  2011-11-08   45
4  2011-11-09   45
5  2011-11-10   45
6  2011-11-11   45
7  2011-11-12   45
8  2011-11-13   45
9  2011-11-14   46
10 2011-11-15   46

Хотя из вашего вопроса неясно, что именно вы хотите сделать, способ сопоставить этот вектор дат (ну, мой кадр данных dat выше) через merge(). Скажем, у нас есть вектор недель, который мы хотим сопоставить, и некоторые связанные данные в кадре данных weekdat:

weekdat <- data.frame(Week = 44:50, Price = c(10, 20, 25, 30, 20, 15, 10))

. Тогда мы можем связать dat с weekdat, используя merge() как таковую :

> merge(dat, weekdat)
   Week      Dates Price
1    44 2011-11-06    10
2    45 2011-11-07    20
3    45 2011-11-08    20
4    45 2011-11-09    20
5    45 2011-11-10    20
6    45 2011-11-11    20
7    45 2011-11-12    20
8    45 2011-11-13    20
9    46 2011-11-14    25
10   46 2011-11-15    25
11   46 2011-11-16    25
12   46 2011-11-17    25
13   46 2011-11-18    25
14   46 2011-11-19    25
15   46 2011-11-20    25
16   47 2011-11-21    30
17   47 2011-11-22    30
18   47 2011-11-23    30
19   47 2011-11-24    30
20   47 2011-11-25    30
21   47 2011-11-26    30
22   47 2011-11-27    30
23   48 2011-11-28    20
24   48 2011-11-29    20
25   48 2011-11-30    20
26   48 2011-12-01    20

Существуют другие способы сопоставления или привязки дат к неделям, но приведенное выше должно дать вам что-то для работы.

31
задан 16 February 2014 в 02:54
поделиться

3 ответа

Это проблема с dx, которая является частью сборки, которая превращает ваши файлы Java .class в файлы .dx для упаковки в Android. В соответствии с этим:

https://code.google.com/p/android/issues/detail?id=34193

, если функция имеет множественные пути возврата, dx объединяет инструкцию return в одну команду возврата, поэтому во время отладки отладчик не может определить, к какой строке относится возврат, и что-то происходит. Это соответствует тому, что я вижу, когда пытаюсь воспроизвести вашу проблему: каждый раз через цикл он проверяет if (a == 3), переходит в конец return 0 в конце и затем возвращается обратно в цикл. Вы видите, что последний return 0 соединяется с return retval в середине цикла.

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

42
ответ дан Scott Barta 22 August 2018 в 09:12
поделиться
  • 1
    Благодарю. Позор этой dx-оптимизации. не может быть отключен в режиме отладки. – user 19 February 2014 в 13:54
  • 2
    Это не оптимизация. Это двоичный формат для Dalvik VM; вы не можете запускать .class файлы непосредственно на Android. – Scott Barta 19 February 2014 в 18:32
  • 3
    Не сам dx; Я имею в виду, не мог ли он создать несколько инструкций возврата, как в исходном коде? – user 19 February 2014 в 22:40
  • 4
    Этот ответ велик. – Nathaniel D. Waggoner 17 September 2014 в 21:35
  • 5
    Я тоже пережил это ... Я понимаю, что существует «причина». для этого, но это просто неприемлемо. Это серьезная проблема проектирования в dx, которая должна быть решена. iOS и другие мобильные платформы не имеют такой проблемы, которая делает жизнь очень сложной для разработчиков – JoelFan 11 January 2015 в 16:30

Вот что сработало для меня, по крайней мере, для входа в исходный код Android SDK:

  1. Установите платформу SDK и источники для Android SDK точно для уровня API версии Android, на которой вы находитесь во время разработки (используйте страницу истории версий Android , чтобы узнать, какой уровень API у вашего устройства есть).
  2. Скомпилируйте приложение именно для этой версии. Например, в Android Studio откройте файл build.gradle вашего приложения и установите значение compileSdkVersion соответственно.
  3. Отлаживайте приложение. Когда вы переходите в исходный файл Android SDK, вы должны увидеть правильную строку.
  4. (необязательно) Перед развертыванием перекомпилируйте последнюю версию SDK. Другими словами, измените compileSdkVersion назад.
2
ответ дан Gary S. 22 August 2018 в 09:12
поделиться
  • 1
    Это не работает и для SDK-кода. Я переключил свою мини-версию API в соответствие с моим целевым устройством, и теперь отладчик показывает правильные строки. – Graeme 11 September 2016 в 01:49

Попробуйте Build -> Rebuild project, а затем Shift + F9. У вас устаревший код работает на приложении.

2
ответ дан Roger Alien 22 August 2018 в 09:12
поделиться
  • 1
    Нет, дело не в этом. Убирали, перестраивали, переделывали, перемещали код немного, просто ради этого тоже - никакой разницы. Я создал новый тестовый проект, чтобы проверить его, и я запускаю его на самом устройстве, а не в эмуляторе. Попробуй! – user 16 February 2014 в 03:17
  • 2
    Я использую intellij IDEA (что то же самое) в течение нескольких лет для разработки Android, и описанная вами проблема возникла только тогда, когда я столкнулся с устаревшим кодом. Может быть, вы отлаживаете библиотечный код? Если нет, то извините, я не знаю, что не так, что вы можете сделать. – Roger Alien 17 February 2014 в 03:29
  • 3
    Нет, я буквально просто создаю новый тестовый Android-проект с помощью студии Android, вырезаю и вставляю код в него и вызываю его из onCreate, и он ведет себя точно так же каждый раз. – user 17 February 2014 в 11:17
  • 4
    Это сработало для меня. Просто сделал Rebuild и повторил. – Ody 15 June 2015 в 19:36
Другие вопросы по тегам:

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