检查整数是否为空

4
我想检查一个 Integer 值是否为空。 这个 Integer 的值是通过表单填写的。以下是我的代码。
这里介绍了该值:
<input name="varsta" placeHolder="Varsta:" type="text" data-constraints='@NotEmpty @Required @AlphaSpecial'> <br/><br/>

现在我想检查是否已经引入了数据。
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();

    Integer varsta = Integer.parseInt(request.getParameter("varsta"));
    request.getSession().setAttribute("varsta", varsta);

    try {
        DBConnection connection = new DBConnection();
        Connection con = connection.Connect();

        PreparedStatement ps = con.prepareStatement(
            "insert into user(Nume,Prenume,E_mail,Parola,Varsta,Sex,Greutate,Inaltime,Nivel_activitate,Calcul_calorii)" + 
            "values ('"+nume+"','"+prenume+"','"+email1+"','"+parola+"','"+varsta+"','"+sex+"','"+greutate+"','"+inaltime+"','"+activitate+"','"+calorii+"')"
        );

        if (varsta == null && "".equals(varsta)) {
            String message = "Va rugam completati cu atentie TOATE campurile!";
            request.setAttribute("message", message);
            request.getRequestDispatcher("/inregistrare.jsp").forward(request, response);           
        } else {
           int i = ps.executeUpdate();

           if (i > 0) {
              request.getRequestDispatcher("/preferinte.jsp").forward(request, response);
           }
        }
        ps.close();
        con.close();         
    } catch(Exception se) {
        se.printStackTrace();
    }
}       

无法工作。

有人可以帮助我吗?


你的代码中存在一些错误和误解。System.out.println(request.getParameter("varsta")) 会输出什么?其中一些错误包括:你将变量定义为 varsta,但是你却检查了 Varsta,这只是第一个问题。由于 varsta 是一个整数,你不能将其与 ""(空)进行比较,因为它是一个整数。 - Jorge Campos
你的 if 条件语句中,是不是想用 varsta 而不是 Varsta 的引用?如果是的话,这个条件语句永远不会返回 true,因为你在比较不同类型的对象:IntegerString - Vladimir Vagaytsev
什么是 request - Seelenvirtuose
写"Varsta"的时候犯了个错误,应该是'varsta'。我知道它是一个整数而我却检查了一个字符串....这就是问题所在! - Bogdan
2个回答

8

Integer只是原始类型int的包装器。因此,它可以是null或存储有效整数值。它没有明显的“空”定义。

如果您仅将Integer与空的String进行比较,则始终会得到false作为结果。请参阅Integer.equals(Object o)实现:

public boolean equals(Object obj) {
    if (obj instanceof Integer) {
        return value == ((Integer)obj).intValue();
    }
    return false;
}

首先,在解析整数时,您可能会在以下行中遇到NumberFormatException异常:

Integer varsta = Integer.parseInt(request.getParameter("varsta"));

而你正在得到它,因为“对于输入字符串:”“看起来像是一个NumberFormatExpection消息。

在您的示例中,您应该检查"varsta"属性值是否为数字(假设它是一个字符串),然后解析它,或者按原样解析并捕获NumberFormatException,这是Integer.parseInt()在不正确参数上抛出的异常。

第一种解决方案:

Integer varsta = null;
String varstaStr = request.getParameter("varsta"); // read string 'varsta' field
if (varstaStr != null && varstaStr.matches("\\d+")) { // null-check and regex check to make sure the string contains only digits
     varsta = Integer.parseInt(varstaStr);
}

第二种解决方案:

Integer varsta = null;
String varstaStr = request.getParameter("varsta"); // read string 'varsta' field
try {
    varsta = Integer.parseInt(varsta);
} catch (NumberFormatException e) {
    // handle error
}

在此之后,你在这条线上还有一个问题:
if(varsta == null && "".equals(varsta)){

这里的varsta引用类型为Integer,因此"".equals(varsta)将始终返回false:

(varsta == null && "".equals(varsta)) = [assume varsta is null] =
((null) == null && "".equals(null)) = (true && false) = false

替换

if(varsta == null && "".equals(varsta)){

使用

if(varsta == null){

这应该能帮到你。

附言:如果您使用的是Java 7或更高版本,请考虑使用try-with-resources来管理ConnectionPreparedStatement


使用以下代码似乎无效:if (varsta == null && "".equals(varsta)) HTTP状态500 - 输入字符串:"" - Bogdan
@Bogdan,request.getParameter("varsta")返回什么类型?它返回StringIntegerObject还是其他任何类型?如果它返回String,请参见我的上面的评论。如果它返回Integer,只需使用简单的空值检查:varsta != null。如果它返回其他对象,请告诉我们它的类型是什么。 - Vladimir Vagaytsev
@Bogdan 如果 varsta == null 成立,那么 "".equals(varsta) 将始终返回 false,因此如果 varstanull,则不会执行您的语句。 - Vladimir Vagaytsev
刚刚更新了我的问题,请看一下?另外,在变量varsta中,我没有引入任何内容。想要检查它是否为空/ null / 没有输入。 - Bogdan
@Bogdan,我明白了。我们的代码有两个问题:解析整数和检查解析值的条件。现在你在解析整数时遇到了错误。我已经再次更新了答案。下次最好发布堆栈跟踪,这有助于定位问题。 - Vladimir Vagaytsev
显示剩余5条评论

3

如果您想检查字段是否为空,则可以使用以下方法:

if (!request.getParameter("varsta").equals("")) {
    System.out.println("not empty");
} else {
    System.out.println("Empty");
}

但是,如果你想获取值,你需要小心:

try {
    if (!request.getParameter("varsta").equals("")) {
        System.out.println("not empty");
        Integer varsta = new Integer(request.getParameter("varsta"));
    } else {
        System.out.println("Exmpty");
    }
} catch (NumberFormatException e) {
    System.out.println("Number is not correct");
}

如果request.getParameter("varsta") = "4558ez",会带来问题。

这可能导致一些困难,请注意。

像这样捕获“Exception”异常是相当恶劣的。最好不要在示例代码中这样做。只捕获相关的异常,如“NumberFormatException”,以及可能抛出的任何“request.getParameter”异常(如果您真的需要捕获任何异常,而不是让异常传播到更高层)。 - hyde
使用request.getParameter("varsta").equals("")无效。 错误:HTTP状态500 - 对于输入字符串:“” - Bogdan

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