gpt4 book ai didi

java - ArithmeticException 偶尔被零除

转载 作者:太空宇宙 更新时间:2023-11-03 10:18:53 24 4
gpt4 key购买 nike

我有一个 JAVA(在 Android 上运行)方法,它偶尔会因被零除而捕获 ArithmeticException,尽管变量 inSampleSize 在循环之前设置为 1,并且每次只乘以 2。以下是原样的方法。知道我在这里错过了什么吗?谢谢!

public static int calculateInSampleSize(
BitmapFactory.Options options, int reqWidth, int reqHeight) {
// Raw height and width of image
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;

try {
if (height > reqHeight || width > reqWidth) {

final int halfHeight = height / 2;
final int halfWidth = width / 2;

// Calculate the largest inSampleSize value that is a power of 2 and keeps both
// height and width larger than the requested height and width.
while ((halfHeight / inSampleSize) > reqHeight
&& (halfWidth / inSampleSize) > reqWidth) {
inSampleSize *= 2;
}
}
} catch (ArithmeticException e) {
LogUtil.Log("ArithmeticException=" + e.getMessage() + " inSampleSize=" + inSampleSize);
Crashlytics.logException(e);
inSampleSize=1;
}
LogUtil.Log("inSampleSize="+inSampleSize);
return inSampleSize;
}

最佳答案

乍一看,如果您将一个数字初始化为 1 并且只将它乘以 2,您永远不会得到 0 的结果。然而,在 while 循环的 32 次迭代之后,inSampleSize 的值实际上将为 0。这是由于Java忽略了int的溢出造成的。

这可以通过执行以下代码来演示:

int count = 0;
int inSampleSize = 1;
while (inSampleSize != 0) {
count++;
inSampleSize *= 2;
}

inSampleSize 的值为零时,此循环将终止,此时 count 为 32。

那么,剩下的问题就是上面的代码在什么情况下会执行32次while循环呢?答案是,当 reqWidthreqHeight 都小于 1 时。

因此,例如,如果您调用:

calculateInSampleSize(options, 0, 0);

您会看到您所描述的问题。

如果 reqWidthreqHeight 为零,加载位图可能根本没有意义,因为它不可见。但是,也许您正在使用 View.getWidth()View.getHeight() 获取宽度和高度,并且在某些情况下调用得太早,在 View 之前在这些方法可能返回 0 的位置进行布局。显然,这最后一点是猜测,如果不查看更多代码就不可能知道,但我相信如果您添加了 reqWidthreqHeight 到您的日志记录,发生这种情况时您会看到它们小于 1。

关于java - ArithmeticException 偶尔被零除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28997474/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com