JAVA 500에러

오늘은 이런 에러를 만났습니다.
"HTTP 상태 500 – 내부 서버 오류"
서버 스크립트에서 오류가 난 경우 발생한다고 합니다.
(확인해보니 오류가 날 만한 코드를 적어놨었습니다)

그래서 이번엔 제가 만났던 500에러의 상황을 소개시켜드리겠습니다.
(코드는 백문이불여일타의 책 내용 중 일부입니다.)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

	<form method="get" action="ParamServlet">
		아이디 : <input type="text" name="id"><br>
		나 이 : <input type="text" name="age"><br>
		<input type="submit" value="전송"> 
	</form>
</body>

</html>
package unit05;

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

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

@WebServlet("/ParamServlet")
public class ParamServlet extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter out = response.getWriter();
        
        
		String id = request.getParameter("id");
        
        	// 여기가 포인트입니다!(1)
		String age = request.getParameter("age");
                // 여기가 포인트입니다!(2)
		int age = Integer.parseInt(request.getParameter("age"));
		out.print("<html><head><title></title></head>");
		out.print("<body>");
		out.print("당신이 입력한 정보입니다.<br>");
		out.print("아이디 : ");
		out.print(id);
		out.print("나이 : ");
		out.print(age);
		out.print("<br><a href='javascript:history.go(-1)'>돌아가기</a>");
		out.print("</body>");
		out.print("</html>");
	}
}

코드를 아래처럼 작성하면 적어도 다음 화면은 보여집니다.
1. String age = request.getParameter("age");

위처럼 말이죠.


그런데 age값을 int로 받았을 땐
2. int age = Integer.parseInt(request.getParameter("age"));

이렇게 500번 에러를 만납니다.

둘의 차이하나는 String이고, 하나는 String을 int형으로 바꿔줬다는 것 밖에는 없습니다.

그런데 왜 String으로 받을 땐 잘 나오고, int로 받을 땐 안나오는 걸까요?

이걸 생각해봅시다.
jsp파일에서 servlet으로 아무것도 입력하지 않고 넘겼다값이 없겠죠?
그럼 servlet에서 데이터를 받을 때 뭐라고 출력해줄까요?
당연히 null이겠죠.
그래서 처음에 String으로 받았을 땐 null null로 잘 나왔습니다.

근데 다음에 String을 parse했었죠. int로요.
그럼 int age = Integer.parseInt(request.getParameter("age")); 해당 코드에서 하려고 했던 일
null값을 숫자로 바꾸겠다는 의미가 되는거죠.
안되는 게 너무 당연한 일이었습니다.

좋은 웹페이지 즐겨찾기