Java 自动IllegalArgumentException消息?

Java 自动IllegalArgumentException消息?,java,assertions,illegalargumentexception,Java,Assertions,Illegalargumentexception,我总是检查公共函数的参数,当出现问题时抛出异常。(对于私人助手,我使用断言) 像这样: if( a < 0 || a >= b ) throw new IllegalArgumentException("'a' must be greater or equal to 0 and smaller than b "); if(a=b) 抛出新的IllegalArgumentException('a'必须大于或等于0,并且 小于b”); 但是写这些错误信息总是

我总是检查公共函数的参数,当出现问题时抛出异常。(对于私人助手,我使用断言)

像这样:

if( a < 0 || a >= b )
    throw new IllegalArgumentException("'a' must be greater or equal to 0 and 
        smaller than b ");
if(a<0 | | a>=b)
抛出新的IllegalArgumentException('a'必须大于或等于0,并且
小于b”);
但是写这些错误信息总是让我很恼火。这个信息对我来说似乎是多余的,因为这个信息只是对这个陈述的否定

a < 0 || a >= b
a<0|a>=b

经常发生的情况是,我使用重构(在eclipse中)重命名变量,然后消息不反映更改。或者我改变了条件,忘记了改变消息

如果我能写下这样的东西,那就太好了:

assertArgument(a >= 0 && a < b);
assertArgument(a>=0&&a
这将引发一个IllegalArgumentException,并显示如下消息

"violated argument assertion: a >= 0 && a < b."
“违反参数断言:a>=0&&a
在C中,您可以编写宏(实际上,在C中,assert只是一个宏)。 在java中有没有一种简单的方法来做类似的事情


谢谢大家!

在C语言中,您不能使用宏来执行此操作,但在cpp(C预处理器)中,您可以:-)如果您确实想这样做,那么在编译java源代码之前,没有任何限制您在其上运行cpp的因素。这将允许您使用cpp样式的宏(您可能需要从cp输出中剥离以
#line
开头的行。)


要在异常中重现条件,需要包含太多的实现细节。如果您的异常消息根据合同描述了合同中的违规行为(例如“未提供父对象”、“金额不能为负数”),则无需在每次条件更改时都对其进行更改。

您可以在生成过程中生成Java代码。。。但这种痛苦并不值得。你的问题不是致命的-只要你能识别一条线,你就会没事。您还可以编写Python脚本来检查代码并检查不一致性。创建一个helper函数
checkParam(param,paramName)
怎么样?然后,即使在重命名变量之后,仍然可以快速编写Python脚本来查找checkParam的所有实例,并确保它们是干净的。也许其他人可以扩展这个想法。你甚至可以在调试模式下使用反射。我也考虑过这样的帮助函数,也许这是最好的方法。你说的“调试模式下的反射”是什么意思?我刚看到番石榴的。这个类提供了这样的助手方法。关于预处理器,你是对的,但是我会把C预处理器看作是C编程的一部分。预处理器语句可能不是C语言的一部分,因为C编译器永远看不到它们,但它们在编写C程序时确实是必不可少的。感谢您的建议:使用预处理器或运行剪切(如Hamish Grubijan所建议的)来更改或检查代码,可以解决我的问题(实际上不是那么致命)。尽管我更多地想到了一个简单的本地Java解决方案,因为其他人清楚地了解正在发生的事情也很重要。然后我又可以只共享生成的代码。。。也许合同设计能帮上忙吗?到目前为止,我还没有使用DbC的经验。如果您正在研究预处理器,您可能希望研究M4(),DbC可能会有所帮助,但您通常不会在生产环境中运行插入指令的代码。因为您的需求是修复异常参数的perl或python脚本之一,所以这可能是最快的方法。