检查空变量时出现空指针异常错误

时间:2013-02-25 14:45:25

标签: java jsp java-ee

<%@page import="java.sql.*"%>
<%@page import="java.util.*"%>
<%@page import="java.lang.*"%>

<%
String fname=request.getParameter("firstname");
String lname=request.getParameter("lastname");
String bday=request.getParameter("birthday");
String user="";
user = request.getParameter("username");
String pass="";
pass = request.getParameter("password");



try {
if(user.isEmpty() && pass.isEmpty()){
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/mydb", "root", "user");

String sql = "Insert into users (firstname, lastname, username, password) values('"+fname+"', '"+lname+"', '"+user+"', '"+pass+"')";
Statement stmt = conn.createStatement();

stmt.execute(sql);

conn.close();
response.sendRedirect("profile.jsp");
}

} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}   
%>

<html>
<body>
<form method="post">
First Name:
<input type="text" name="firstname"/>
<br>
Last Name:
<input type = "text" name="lastname"/>
<br>
Birthdate:
Day: <select name="day">
<%
for(int x=1;x<32;x++){
%>
<option value= <% out.println(x); %> ><% out.println(x); %></option>
<%
}
%>
</select>
Month: <select name="month">
<%
for(int y=1;y<13;y++){
%>
<option value= <% out.println(y); %> ><% out.println(y); %></option>
<%
}
%>
</select>
Year: <select name="year">
<%
for(int z=1985;z<2030;z++){
%>
<option value= <% out.println(z); %> ><% out.println(z); %></option>
<%
}
%>
</select>
<br>
Username:
<input type="text" name="username"/>
<br>
Password:
<input type="password" name = "password"/>
<br>
<input type="submit" value="Register"/>
</form>
</body>
</html>

我收到错误:

HTTP状态500 -

输入例外报告

消息

description服务器遇到内部错误(),导致无法完成此请求。

例外

org.apache.jasper.JasperException:java.lang.NullPointerException 根本原因

显示java.lang.NullPointerException

5 个答案:

答案 0 :(得分:7)

Bobby Tables problem放在一边,你需要null - 在调用方法之前检查你的变量:

if(user != null && !user.isEmpty() && pass != null && !pass.isEmpty()){
}

但在此代码投入生产之前,您应该自行修复SQL injection problem。否则,你的数据库很可能被隔壁的“剧本小孩”消灭。使您的SQL语句参数化,并将值绑定到它,而不是将值嵌入到语句中。

String sql = "Insert into users (firstname, lastname, username, password) values(?,?,?,?)";
// Bind values to 

最后,您似乎计划在数据库中存储密码。即使在您不打算部署到Internet的玩具数据库中,也不要这样做。这是你可以对客户做的最糟糕的事情,甚至是内部客户。阅读this answer以解决此问题。

答案 1 :(得分:4)

您没有检查user是否为空。你假设它不是null然后检查它是空的。在检查是否为空之前,您需要检查空值。

也许Apache Commons StringUtils.isBlank()可能用于简洁/可靠性?

答案 2 :(得分:1)

尝试替换

if(user.isEmpty() && pass.isEmpty()){ 

if((user != null && pass != null) && (user.isEmpty() && pass.isEmpty())) {

答案 3 :(得分:1)

您正在分配一个空字符串,然后立即用request.getParameter中的新值替换它。这将覆盖您初始化的值,因此如果参数为null,则user和pass的值为null。然后,如果在null String对象上调用isEmpty,则会得到NullPointerException

答案 4 :(得分:0)

尝试使用isNullOrEmpty()取代isEmpty()