Cannot invoke "String.equals(Object)" because "edit" is null

 

   Null Pointer, 생각보다 쉽게 보는 오류다보니 해결도 쉬워서 그렇게 어려운 에러는 아니었는데 생각보다 꽤 애먹었던 부분이 있어 기록으로 남기고자 한다. 보통 널포인터 오류가 나면 참조변수에 아무것도 없겠거니 하고 대수롭지 않게 여겨서 이런 상황이 발생했다 생각한다.

 

	<ul class="nav nav-pills">
      	<!-- R : 전체상품 불러오기 -->
	  	<li class="nav-item"><a class="nav-link"  href="products">All Book</a></li>
	  	<!-- C : 상품입력 -->
		<li class="nav-item"><a class="nav-link" href="AddBook">Add Book</a></li>
		<!-- U : 상품수정 -->
		<li class="nav-item"><a class="nav-link" href="products?edit=update">Book update</a></li>
		<!-- D : 상품삭제 -->
		<li class="nav-item"><a class="nav-link" href="products?edit=delete">Book delete</a></li>
	</ul>

 

   먼저 요청 부분이다. products에 매핑할 때 수정과 삭제는 각각 파라미터를 지정해주었다.

 

	<% String edit = (String) request.getParameter("edit"); %>

	<div class="p-5 mb-4 bg-body-tertiary rounded-3">
		<div class="container-fluid py-5">
			<h1 class="display-5 fw-bold">
				<% if(edit.equals("update")){ %> 도서 편집
				
				<% } else if(edit.equals("delete")){ %> 도서 삭제
				
				<% } else { %> 도서 목록 <% } %>
			</h1>
			<p class="col-md-8 fs-4">
				<% if(edit.equals("update") || edit.equals("delete"))
				{ out.print("BookEdit"); }
				else { out.print("BookList"); } %>	
			</p>
		</div>
	</div>

 

   그리고 Null에러가 발생한 위치이다. 단순히 넘어온 파라미터를 String 변수에 담아 equals() 함수를 사용하여 조건문을 통해 요청에 맞는 데이터가 출력되도록 작성했는데 에러가 발생했다. 그것도 이상하게 편집과 삭제 페이지는 정상적으로 작동했지만 아무것도 없는 전체 목록 조회에서만 오류가 생겼는데 이유를 찾아보니 좀 더 명확하게 표시하라는 조언을 듣고 Null값을 직접 입력하기로 했다.

 

	<%  Stirng edit = null;
    
		if(request.getAttribute("edit")!=null){
			edit = (String)request.getAttribute("edit");
		}
	%>

	<div class="p-5 mb-4 bg-body-tertiary rounded-3">
		<div class="container-fluid py-5">
			<h1 class="display-5 fw-bold">
				<% if(edit.equals("update")){ %> 도서 편집
				
				<% } else if(edit.equals("delete")){ %> 도서 삭제
				
				<% } else if(edit==null) { %> 도서 목록 <% } %> 
			</h1>
			<p class="col-md-8 fs-4">
				<% if(edit.equals("update") || edit.equals("delete"))
				{ out.print("BookEdit"); }
				else { out.print("BookList"); } %>	
			</p>
		</div>
	</div>

 

   위와 같이 수정했는데 당연하게도 되지 않았다 ^0^…

 

   그래서 진짜 이유를 살펴보니, String은 저번에도 말했다싶이 일반 변수가 아니라 객체다. 즉 edit은 참조변수가 되며, 참조변수에 아무런 주소값을 가지고 있지 않은 상태에서 equals() 함수 를 실행하려 했기 때문에 에러가 뜨는것! 실제로 맨 처음처럼 작성했더니 JSP페이지 자체에서도 DeadCode라고 주의를 주었다. 하지만 이게 왜 안되는지 이해를 못했으니 실행했고 결과는 500페이지가 반겨주었다.

 

   쉽게 말해 null인 상태에서 equals() 함수 자체가 실행되지 않으니 조건식에서 에러가 발생한 경우였다. equals() 함수는 일단 String객체를 받지 않았기 때문에 그 함수를 실행하려하니 동작하지 않는 것.

   (단, edit != null 같이 입력하면 당연하게도 작동이 된다)

 

	<%  Stirng edit = "main";
    
		if(request.getAttribute("edit")!=null){
			edit = (String)request.getAttribute("edit");
		}
	%>

	<div class="p-5 mb-4 bg-body-tertiary rounded-3">
		<div class="container-fluid py-5">
			<h1 class="display-5 fw-bold">
				<% if(edit.equals("update")){ %> 도서 편집
				
				<% } else if(edit.equals("delete")){ %> 도서 삭제
				
				<% } else { %> 도서 목록 <% } %> 
			</h1>
			<p class="col-md-8 fs-4">
				<% if(edit.equals("update") || edit.equals("delete"))
				{ out.print("BookEdit"); }
				else { out.print("BookList"); } %>	
			</p>
		</div>
	</div>

 

   다시 원인을 파악했으니 기존 JSP화면에 edit참조변수에 "main"이라는 값을 저장하고 실행하니 무사히 화면이 로드되는 것을 확인할 수 있었다. String객체에 대해 이제 완벽하게 다 안다고 생각했는데 이런 오류를 통해 다시 기초부터 열심히 해야겠다는 생각이 들었다...

'오류노트' 카테고리의 다른 글

005  (0) 2024.11.12
Type mismatch & Cannot cast  (0) 2024.10.27
Type mismatch: cannot convert from int to (Data Type)

 

 

   가장 쉽게 보는 오류 중 하나로 변수에 데이터를 담을 때 형식이 맞지 않아 발생한다.

   보통 이럴 때는 데이터 타입을 잘못 지정했는지 확인해보거나, 아니면 강제로 형변환을 통해 해결하는 경우가 많다.

   잘못 지정했는지 확인하여 해결되는 것 말고, 강제로 형변환을 통하는 경우 몇가지를 알아보자.

 

		int a = 100;
		request.setAttribute("int_a", a);
		
		int b = request.getAttribute("int_a"); //에러 발생

 

   대표적으로 사용하는 예는 request객체를 활용할 때, request에 데이터를 저장하게 되면 어떤 타입이던 객체들의 조상인 Object로 저장되기 때문에 다시 꺼낼때는 무조건 Type mismatch 에러가 발생하게 된다. 이럴 때는 그냥 강제 형변환으로 받아주면 문제 없다.

		int b = (int) request.getAttribute("int_a"); //강제 형변환

 


 

Cannot cast from String to (Data Type)

 

   1 : 1 로 변환이 되는 경우가 아니라 이번에는 문자열에서 숫자 그대로 바꾸는 방법을 알아보자.

 

   위와 같은 강제 형변환은 대부분 원본을 왜곡시키며 강제로 형태를 바꾸는 것이 가능하지만 문자열에서 강제 형변환은 힘들다. 이는 String 자체가 하나의 객체기 때문에 데이터 타입으로 보기는 어렵기 때문이다. 따라서 문자열을 정수나 실수로 바꾸려 한다면 해당하는 데이터 타입 클래스의 parse~ 함수를 이용해야 한다.

		String a = "12345";
		request.setAttribute("S_a", a);
		
		int b = Integer.parseInt((String)request.getAttribute("S_a"));

 

 

'오류노트' 카테고리의 다른 글

005  (0) 2024.11.12
java.lang.NullPointerException  (0) 2024.10.29

+ Recent posts