java.lang.ArithmeticException: делить на ноль - PullRequest
0 голосов
/ 18 марта 2019

У меня много проблем с этим.Он работает на Android Nougat и Marshmallow, но на Lollipop он не будет работать (в основном, на моем fireTV).У меня проблема java.lang.ArithmeticException: divide by zero.Любые идеи, почему это сбой?

long startTime = System.currentTimeMillis();
InputStream is = response.body().byteStream();
BufferedInputStream bis = new BufferedInputStream(is);

long size = 0;
int red = 0;
byte[] buf = new byte[1024];
while ((red = bis.read(buf)) != -1) {
    size += red;
}
long endTime = System.currentTimeMillis();

Log.d("ERROR CHECK", startTime + " " + endTime + " " + size);
double rate = (((size / 1024) / ((endTime - startTime) / 1000)) * 8); // THIS IS WHERE MY PROBLEM IS - A ZERO
                                                                        // SOMEWHERE.
Log.d("ERROR CHECK", "No Zeros....");
rate = Math.round(rate * 100.0) / 100.0;
String ratevalue;
if (rate > 1000)
    ratevalue = String.valueOf(rate / 1024).concat(" Mbps");
else
    ratevalue = String.valueOf(rate).concat(" Kbps");
if (is != null) {
    is.close();
}
if (bis != null) {
    bis.close();
}
Log.d("download", "download speed = " + ratevalue);

Строка, где я указал с комментарием, где проблема.Все значения в этой строке заполнены, я проверил в этой строке Log.d перед ним.

Ответы [ 2 ]

1 голос
/ 18 марта 2019

Если endTime - startTime меньше 1000, то оператор деления вернет 0.Разделите на 1000.0

0 голосов
/ 18 марта 2019

Когда знаменатель становится нулевым из-за небольшой разницы, он падает. Используйте double, проверьте знаменатель и, если ноль, сделайте некоторое значение (например, 1 или 0,1), как показано ниже.

double den = (endTime - startTime) / 1000.0)) * 8.0 ;
if(den==0) den= 0.1;
double rate = (((size / 1024) / (den);

Я думаю, что подобный код исправит ваш сбой.

...