关于java:在图形代码中处理除零

Handling division by zero in graphics code

我正在编写一个用于程序图像生成的库(Clisk),它允许用户定义自己的数学函数来生成图像。

它们显然可以定义一个函数,该函数可能导致某些像素除以零,例如(伪代码)

1
red = 1.0 / (xposition - 0.5)

只要xposition = 0.5(图像的中间),这将导致除以零

理想情况下,我不希望图像生成崩溃......但与此同时,我不想创建一个笨重的黑客,以忽略以后会导致问题的零除。

处理这些案件的好方法,强大而系统的方法是什么?


Ideally I don't want image generation to crash... but at the same time I don't want to create a clunky hack to ignore divide by zeros that will cause problems later.

(我假设您的代码片段是一些用户提供的代码的示例......)

显然,如果用户提供的代码可能会抛出异常,那么就无法阻止这种情况发生。 (并且在分裂之前检查的建议对你来说显然是无关紧要的。)

除了"崩溃",你能做些什么呢?生成一个空图像?忽略用户的功能?你会生产垃圾......而这不是用户需要的。

你肯定无法进入并修复他/她的java代码。 (如果该片段是用某种自定义语言编写的代码,那么你就无法触及并纠正它。你/你的库不知道用户提供的代码应该做什么......)

不,我认为最好的答案是将用户提供的代码中出现的任何意外(未经检查)异常包装在您自己的异常中,以便清楚地告诉用户他的代码中发生了错误。然后由应用程序代码调用您的库代码来处理异常还是"崩溃"。

如果您要求用户编写其功能的"良好,强大,系统的方法",我认为您正在咆哮错误的树。这不是你真正关心的问题......


你总是可以提供一个参数,询问他们在除零时做什么。毕竟,这是他们的代码 - 他们应该知道什么是最适合他们的情况。

那么问题就变成了,该参数的合理默认值是什么?我会说"返回0.0"或"抛出异常"对于此应用程序都是合理的。请确保记录下来。


我真的不是图形程序员,但你可以做到

1
2
3
 private static final double MIN_X = 0.0000001

 red = 1.0 / Math.max(xpos - 0.5, MIN_X);

显然,如果允许负数,你可能不得不在那里删除一个绝对值