我有3个.jsp文件。 index.jsp和sqrtcalculator.jsp以及error.jsp。
在index.jsp中有一个文本字段和一个按钮。在sqrtcalculator.jps中,有计算器。
现在,当我将该字段留空并按下按钮时,将调用一个预期,因为该字段为空。然后,我可以重新路由到单个error.jsp站点以显示错误,并将异常堆栈视为
<%= request.getAttribute("javax.servlet.error.request_uri") %>
<%= exception.getMessage() %>
<%= exception %>
等
问题是,当我在文本字段中输入-5时,我无法获得异常,因为Math.sqrt(-5)不会返回错误而是“NaN”。
如何强制它成为例外?我们的想法是将用户重新路由到单个error.jsp并显示错误。但就像我说Math.sqrt(-5)不会返回错误或异常,而是“NaN”文本字符串。
我不想要这样的东西只是FYI
<%if (NaN){
%>
<p>Nope, Square root from negative numbers is not defined!</p>
<%}
%>
答案 0 :(得分:2)
警告,上一个答案中对NaN的测试是错误的(NaN不等于它自己)。在Java中,测试NaN的更好方法是
if (Double.isNaN(answer)) {
// throw exception
}
替代地
if (answer != answer) {
}
虽然第二个版本可行,但肯定会让那些不了解NaN奇怪行为的人感到困惑。
答案 1 :(得分:1)
它可能会返回NaN
,因为确实定义了负数的平方根,它们只不是实数。你有什么理由不能这样做吗?
if(Double.isNaN(answer))
throw new ArithmeticException("Answer unreal");
这应该是你的异常处理代码,但源代码行可能只是几行。我从来没有编写JSP,但这在Java中是有意义的。
答案 2 :(得分:1)
怎么样:
if (x >= 0.0) {
return Math.sqrt(x);
} else {
throw new ArithmeticException("Square root from negative numbers is not defined!");
}
请注意ArithmeticException
是RuntimeException
的子类,因此不需要在函数的throws
子句中声明。
答案 3 :(得分:0)
我在jsp方面不是很好但是你应该能够使用基本的java代码..所以我会检查我的NaN结果并抛出异常
if (NaN == result)
throw new Exception("NaN");
你必须调整if;)
答案 4 :(得分:0)
我会问为什么你在JSP中使用scriptlet。
如果你的应用程序真的只有三个页面(index.jsp和sqrtcalculator.jsp和error.jsp),那么可能它是合理的。
但我的一般建议是远离JSP中的scriptlet代码并且更喜欢JSTL。使用Model-2 MVC安排在服务器端组件中完成这些计算。
如果您的应用程序实际上只包含三个页面,那么重新构建它以使用Model-2 MVC并不困难。您可能会发现它的扩展性更强。如果您不熟悉Model-2 MVC,可以阅读它here。如果你熟悉它,这可能是一个自足的问题,它足够小,可以让你看到它可以在未来的项目中提供一些价值。
另一种想法是将复数添加到计算器中,因为负数的平方根确实是一个有效的概念。它只需要虚数。也许你的计算器需要扩展以最大限度地提高实用性。
答案 5 :(得分:0)
我似乎无法让它发挥作用......
if (d < 0){
throw new Exception("Negative Numbers not possible!");
}
d是通过d_string = request.getParameter(“numberfromtextfield”)进行的双重读取,并通过double d = Double.parseDouble(d_string);转换为double。
这就是Eclipse告诉我的:http://pastebin.ca/1691409