在try/catch中未捕获NumberFormatException异常

5
我正在创建一个.jsp页面时遇到了问题。对于那些担心的人,这个网站是为了完成作业而创建的,但我试图超越要求,不涉及成绩相关内容,仅出于自己的利益。
言归正传: 我从用户那里获取输入,执行 method="post" 方法并刷新页面,在理想情况下它可以正常工作(这是作业的要求)。然而,我正试图在用户将字符串输入到 int 字段的情况下使用 try/catch 块。
int Svolt = 0;
double Amperes = 0.0;
double LEDdrop = 0.0;

if (request.getParameter("Svolt") != null) {
try {
    Svolt = Integer.parseInt(request.getParameter("Svolt")); 
} catch ( NumberFormatException e ) {
    %>
    <script type ="text/javascript">
        alert("The source voltage must be an integer. Please fix this.");
    </script>
    <%                                                    
}

我尝试将 "NumberFormatException" 更改为 "Exception",但返回的错误代码仍相同。 之前,我的 try catch 位于 if() 语句之前,这样可以工作,但没有显示我想要的警报框。
以下是该代码:
final double MA_TO_A = 0.001;
int Svolt = 0;
double Amperes = 0.0;
double LEDdrop = 0.0;

try {
    if (request.getParameter("Svolt") != null) {
        try {
            Svolt = Integer.parseInt(request.getParameter("Svolt"));
        } catch (Exception e) 
        {
            %>
            <script type ="text/javascript">
                alert("The source voltage must be an integer. Please fix this.");
            </script>
            <%
        }
        Amperes = Double.parseDouble(request.getParameter("Amperes"));
        LEDdrop = Double.parseDouble(request.getParameter("LEDdrop"));

        out.println("Ideal resistance is: " + ((Svolt - LEDdrop) / (Amperes * MA_TO_A)) + " Ohms.");   
    }
} catch (Exception e) {
        out.println("Please make sure your inputs are correct.");
}

任何帮助都是受欢迎的,您的时间也很宝贵。非常感谢! 编辑: 抱歉,本来是想复制粘贴错误代码的:
org.apache.jasper.JasperException: java.lang.NumberFormatException: For input string: "a"

被测试的输入为字符串"a"

编辑2: 备份/编辑/测试@Nambari的建议

final double MA_TO_A = 0.001;
int Svolt = 0;
double Amperes = 20.0;
double LEDdrop = 1.8;

try {
    if (request.getParameter("Svolt") != null) {
        try {
            Svolt = Integer.parseInt(request.getParameter("Svolt"));
        } catch (Exception e) 
        {
            %>
            <script type ="text/javascript">
                alert("The source voltage must be an integer. Please fix this.");
            </script>
        <%
        }
        out.println("Ideal resistance is: " + ((Svolt - LEDdrop) / (Amperes * MA_TO_A)) + " Ohms.");   
    }
} catch (Exception e) {
    out.println("Please make sure your inputs are correct.");
}

输出:

理想电阻为:-90.0欧姆

警报框显示(“源电压必须是整数,请修正此项。”)

无错误代码。

无out.println显示(“请确保输入正确”)。

最终编辑:

代码现在几乎达到预期效果,但已经足够好。

                    final double MA_TO_A = 0.001;
                    int Svolt;
                    double Amperes;
                    double LEDdrop;

                    if (request.getParameter("Svolt") != null) 
                    {
                        try 
                        {

                            try 
                            {
                                Svolt = Integer.parseInt(request.getParameter("Svolt"));
                            } catch (Exception e) 
                            {
                            %>
                            <script type ="text/javascript">
                                alert("The source voltage must be an integer. Please fix this.");
                            </script>
                            <%  
                            Svolt = 0;
                            }
                            try 
                            {
                                Amperes = Double.parseDouble(request.getParameter("Amperes"));
                            } catch (Exception e) 
                            {
                                %>
                                <script  type = "text/javascript"> 
                                    alert("The source voltage must be an integer. Please fix this.");
                                </script> 
                                <% 
                                Amperes = 0.0;
                            }
                            try 
                            {
                                LEDdrop = Double.parseDouble(request.getParameter("LEDdrop"));
                            } catch (Exception e) 
                            {
                            %>
                                <script  type = "text/javascript"> 
                                    alert("The source voltage must be an integer. Please fix this.");
                                </script> 
                            <%
                            LEDdrop = 0.0;
                            }
                            out.println("Ideal resistance is: " + ((Svolt - LEDdrop) / (Amperes * MA_TO_A)) + " Ohms.");
                        } catch (Exception e)
                        { 
                            out.println("Please make sure your inputs are correct."); 
                        }   
                    }

我知道有很多术语,但这就是最终结果。不知何故,这一切都运作良好。感谢所有帮助过我的人!


4
错误代码和异常信息是什么?顺便说一下,在JSP中嵌入Java代码不是最佳实践。可能EL APIs(如JSTL等)是很好的替代方案。 - kosa
2
你的问题中提到它“返回了相同的错误代码”。它产生了什么错误? - mthmulders
2
这就是不使用脚本片段的一个原因。 - NimChimpsky
1
你确定异常不是来自于后面的parseDoubles吗? - Joeri Hendrickx
2
能否在您的表单中除了和Svolt相关的代码之外,尝试把其他全部代码都删除?我认为有其他东西弄乱了这个字段。先备份现有的代码,然后除了Svolt以外的所有内容都删除,看看能否找到问题所在。 - kosa
显示剩余7条评论
2个回答

3
首先,不建议在Java Servlet页面中嵌入Java代码,应该只关注JSP的表现层,没有业务逻辑。您需要一个Servlet来处理HTTP请求,执行您的逻辑,将结果放在响应中,然后重定向到JSP。
另一方面,JSP页面抛出的异常类型是org.apache.jasper.JasperException,而不是NumberFormatException。 Apache Jasper JSP引擎捕获数字格式异常,并向Tomcat抛出JasperException。
此外,请清除Tomcat缓存以确保JSP部署到最新版本,为此,请删除以下文件夹和文件(包括war):
{tomcat安装路径}\work\Catalina\localhost(您的应用程序)
{tomcat安装路径}\webapps(您的应用程序)
如果您捕获通用的java.lang.Exception,则应该可以正常工作。
也可以尝试这个:
    final double MA_TO_A = 0.001;
    int Svolt = 0;
    double Amperes = 0.0;
    double LEDdrop = 0.0;
    try {
        if (request.getParameter("Svolt") != null) {
            try {
                Svolt = Integer.parseInt(request.getParameter("Svolt"));
             } catch (Exception e) 
            {
                //Changed to avoid the message if no exception, or for some other reason it fails to execute the conditions
                out.println("<script type =\"text/javascript\">")
                out.println("alert(\"The source voltage must be an integer. Please fix this.\");") ;
                out.println("</script>")
            }
            Amperes = Double.parseDouble(request.getParameter("Amperes"));
            LEDdrop = Double.parseDouble(request.getParameter("LEDdrop"));

            out.println("Ideal resistance is: " + ((Svolt - LEDdrop) / (Amperes * MA_TO_A)) + " Ohms.");   
        }
    } catch (Exception e) {
            out.println("Please make sure your inputs are correct.");
    }

1
这是基于我的评论发布的答案:
我建议在您的表单上除了Svolt相关代码之外,删除所有内容并尝试。我认为有其他东西搞砸了这个字段。备份现有代码。除了Svolt之外删除所有内容,看看我们能否找出问题所在。
请确保按照上面的评论建议正确同步try/catch块与代码流程。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接