Несколько файлов dex определяют < мой пакет > / BuildConfig, не могут найти причину:

Вам нужно проверить это самостоятельно и выбросить исключение. Целое число, делящееся на ноль, не является исключением в стандартном 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, хотя я не думаю, что это изменилось с предыдущей итерации) конкретно указывает:

Если второй операнд / или % равен нулю, поведение не определено.

Таким образом, может выбросить это (или любое другое) исключение. Он также может отформатировать ваш жесткий диск и смеяться насмешливо: -)


Если вы хотите реализовать такого зверя, вы можете использовать что-то вроде 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;
}
29
задан Emil Adz 3 August 2014 в 12:23
поделиться

5 ответов

В моем случае аналогичная ошибка произошла, потому что в файлах AndroidManifest.xml было 2 модуля с одинаковым именем пакета. Использование разных имен пакетов в модулях решило проблему.

Также то же самое происходит, когда библиотека jar включается дважды (или более раз) в несколько модулей, как зависимость. В этом случае сообщение об ошибке говорит о дубликатах конфигурации, названных в честь имени пакета этой библиотеки. Я решил это с включением библиотеки в качестве зависимости в один модуль, а второй модуль имел в зависимостях первый модуль.

73
ответ дан Mixaz 3 August 2014 в 12:23
поделиться

Добавьте это в свой build.gradle:

android {
    dexOptions {
        preDexLibraries = false
    }
}

Я полагаю, что в этом случае нет конфликта BuildConfig.java.

РЕДАКТИРОВАТЬ:

Почему все вышеперечисленное работает: Android-студия сначала дексирует библиотеки, а затем дексирует модуль приложения. Если у вас есть библиотечный модуль с тем же именем пакета, что и у вашего модуля приложения, эта «предварительная индексация» приведет к созданию BuildConfig.java в том же пакете, что и для приложения.

Не «предварительная индексация» немного замедлит процесс сборки , поэтому я предлагаю вместо этого изменить имя пакета вашей библиотеки.

21
ответ дан Community 3 August 2014 в 12:23
поделиться

Я получил эту проблему, подписывая мой мгновенный 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 в конец имени пакета

3
ответ дан Pablo Cegarra 3 August 2014 в 12:23
поделиться

Если вы используете NewRelic, обновите его как минимум до 5.21.1.

0
ответ дан Sami 3 August 2014 в 12:23
поделиться

Для меня просто очистка проекта очистила эту ошибку.

11
ответ дан Steve D. 3 August 2014 в 12:23
поделиться
Другие вопросы по тегам:

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