Javaの大海原をじゃばじゃばと

勉強メモとか雑記です

文字列同士の等値比較という初歩的なミスを繰り返さないために、シャレを考えてみた(IT勉強記録)

f:id:hanabooh:20210719212543p:plain
備忘録でございます_φ( ̄ー ̄ )そしてやっとこさ、はてブはてな記法デビュー\( ˆoˆ )/
コードきれいに表示されて感動する〜

「初学者がやりがち」とされる以下のトラップにまたハマってしまったので、自戒も込めて!
Javaで文字列同士を比較する場合、Stringクラスは参照型だから等値比較でなく等価比較せねばならない。と認識していますが
また等値比較やっちまったぜ…

前回の記事でひっそりと宣言した通り、2022年1月の転職に向けてSpring bootでポートフォリオを作成するんですが
急がば回れということでサーブレットJSPをさらっと復習した方が良さそうだな〜と思い、こちらのテキストで手を動かし中ながら勉強中でして。
その練習問題中で、トラップにハマってしまったのでした。
sukkiri.jp


▼上記テキスト中の練習問題(フォームを使ったユーザー登録もどきの作成)で私が書いたコード
※環境:IDE(Eclipse_2019-12)を使用・OSはmacOS Big Sur

formSample.jsp(入力フォームをレスポンスするJSPファイル)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登録フォーム</title>
</head>
<body>
<form action="/exampleFrom7/FormSampleServlet" method="post">
名前<br>
<input type="text" name="name"><br>
性別<br>
男<input type="radio" name="gender" value="0">
女<input type="radio" name="gender" value="1">
<input type="submit" value="登録">
</form>
</body>
</html>


【このコード内でやってしまった】FormSampleServlet.java(登録結果画面をレスポンスするサーブレットクラス)

package servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class FormSampleServlet
 */
public class FormSampleServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;


	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//リクエストパラメータの受け取り
		request.setCharacterEncoding("UTF-8");
		String name = request.getParameter("name");
		String gender = request.getParameter("gender");

		String msg = "";
		boolean isOK = true;

		if(name == null || name.length() == 0) {
			msg += "名前が入力されていません<br>";
			isOK = false;
		}
		if(gender == null || gender.length() == 0) {
			msg += "性別が選択されていません<br>";
			isOK = false;
		}else {
			if(gender=="0") {
				gender = "男性";
			}else {
				gender = "女性";
			}
		}

		if(isOK) {
			msg=name + "さん(" + gender + ")を登録しました";
		}

		response.setContentType("text/html; charset=UTF-8");
		PrintWriter out = response.getWriter();
		out.println("<!DOCTYPE html>");
		out.println("<html>");
		out.println("<head>");
		out.println("<title>ユーザー登録もどき</title>");
		out.println("</head>");
		out.println("<body>");
		out.println("<p>" + msg + "</p>");
		out.println("</body>");
		out.println("</html>");
	}

}

そう、登録された性別を確認するif文条件式内で、文字列同士の等値比較をしてしまっていました。正しくはこう、

if(gender.equals("0")) {

ですね。等値比較の記述でもコンパイルエラーにはならないけど、たまに動きがおかしくなる、といういや〜なもの。

もうこんな初歩的なミスを繰り返すまい!と思って、思いついたイメージがこちら。
「もじもじ(文字文字)したらあかん」

f:id:hanabooh:20210719212820j:plain

なんかこう色んなヤバさを醸し出す記事と画像ですが、恥はかき捨てです_φ( ̄ー ̄ )笑
ずさんな勉強記録になってしまったけど、ちょっとずつ精度上げて、有益な技術ブログをも執筆できるようになるぜい。
読んでくださりありがとうございましたm(_ _)m