Вам нужно проверить это самостоятельно и выбросить исключение. Целое число, делящееся на ноль, не является исключением в стандартном C ++.
Ни одно из чисел с плавающей запятой не равно нулю, но по крайней мере имеет специальные средства для борьбы с ним.
Исключения, перечисленные в Стандарт ISO:
namespace std {
class logic_error;
class domain_error;
class invalid_argument;
class length_error;
class out_of_range;
class runtime_error;
class range_error;
class overflow_error;
class underflow_error;
}
, и вы думаете, что overflow_error
идеально подходит для указания деления на ноль.
Но раздел 5.6
(C++11
, хотя я не думаю, что это изменилось с предыдущей итерации) конкретно указывает:
Если второй операнд
blockquote>/
или%
равен нулю, поведение не определено.Таким образом, может выбросить это (или любое другое) исключение. Он также может отформатировать ваш жесткий диск и смеяться насмешливо: -)
Если вы хотите реализовать такого зверя, вы можете использовать что-то вроде
intDivEx
в следующей программе:#include <iostream> #include <stdexcept> // Integer division, catching divide by zero. inline int intDivEx (int numerator, int denominator) { if (denominator == 0) throw std::overflow_error("Divide by zero exception"); return numerator / denominator; } int main (void) { int i = 42; try { i = intDivEx (10, 2); } catch (std::overflow_error e) { std::cout << e.what() << " -> "; } std::cout << i << std::endl; try { i = intDivEx (10, 0); } catch (std::overflow_error e) { std::cout << e.what() << " -> "; } std::cout << i << std::endl; return 0; }
Это выводит:
5 Divide by zero exception -> 5
, и вы можете видеть, как он выбрасывает и улавливает исключение для деления на нулевой случай.
Эквивалент
%
почти то же самое:// Integer remainder, catching divide by zero. inline int intModEx (int numerator, int denominator) { if (denominator == 0) throw std::overflow_error("Divide by zero exception"); return numerator % denominator; }
В моем случае аналогичная ошибка произошла, потому что в файлах AndroidManifest.xml было 2 модуля с одинаковым именем пакета. Использование разных имен пакетов в модулях решило проблему.
Также то же самое происходит, когда библиотека jar включается дважды (или более раз) в несколько модулей, как зависимость. В этом случае сообщение об ошибке говорит о дубликатах конфигурации, названных в честь имени пакета этой библиотеки. Я решил это с включением библиотеки в качестве зависимости в один модуль, а второй модуль имел в зависимостях первый модуль.
Добавьте это в свой build.gradle:
android {
dexOptions {
preDexLibraries = false
}
}
Я полагаю, что в этом случае нет конфликта BuildConfig.java
.
РЕДАКТИРОВАТЬ:
Почему все вышеперечисленное работает: Android-студия сначала дексирует библиотеки, а затем дексирует модуль приложения. Если у вас есть библиотечный модуль с тем же именем пакета, что и у вашего модуля приложения, эта «предварительная индексация» приведет к созданию BuildConfig.java
в том же пакете, что и для приложения.
Не «предварительная индексация» немного замедлит процесс сборки , поэтому я предлагаю вместо этого изменить имя пакета вашей библиотеки.
Я получил эту проблему, подписывая мой мгновенный apk. Проблема:
плохой module / app / manifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.stackoverflow">
good: module / app / manifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.stackoverflow.app">
Просто добавляем .app в конец имени пакета
Если вы используете NewRelic, обновите его как минимум до 5.21.1
.
Для меня просто очистка проекта очистила эту ошибку.