1
<%@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 -

タイプ例外レポート

メッセージ

説明サーバーで内部エラー () が発生したため、この要求を実行できませんでした。

例外

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

java.lang.NullPointerException

4

5 に答える 5

7

Bobby Tablesの問題はさておき、nullメソッドを呼び出す前に変数をチェックする必要があります。

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

ただし、このコードが本番環境に入る前に、 SQL インジェクションの問題を修正する必要があります。そうしないと、あなたのデータベースは、隣の「脚本家の子供」によって一掃される重大な危険にさらされています. ステートメントに値を埋め込むのではなく、SQL ステートメントをパラメーター化して、それに値をバインドします。

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

最後に、パスワードをデータベースに保存する予定のようです。インターネットに展開する予定のないおもちゃのデータベースであっても、これを行わないでください。それは、社内の顧客であっても、顧客に対してできる最悪のことです。この回答を読んで、この問題を解決してください。

于 2013-02-25T14:48:48.463 に答える
4

チェックしていないuserのはnullです。nullではないと想定し、空であることを確認します。空であるかどうかを確認する前に、nullを確認する必要があります。

おそらく、 Apache Commons StringUtils.isBlank()は、簡潔さ/信頼性のために役立つ可能性がありますか?

于 2013-02-25T14:47:12.743 に答える
1

空の文字列を割り当ててから、すぐに request.getParameter からの新しい値に置き換えています。これにより、初期化された値が上書きされるため、パラメーターが null の場合は、ユーザーとパスに null 値が設定されます。次に、null String オブジェクトで isEmpty を呼び出すと、NullPointerException が発生します。

于 2013-02-25T14:53:23.517 に答える
1

交換してみる

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

if((user != null && pass != null) && (user.isEmpty() && pass.isEmpty())) {
于 2013-02-25T14:48:38.747 に答える
0

isNullOrEmpty() で試してください isEmpty() の場所です

于 2013-02-25T14:51:37.813 に答える