[JSP 오류] java.lang.NullPointerException

Gammi·2022년 11월 8일
0

오류 해결

목록 보기
5/25
post-thumbnail

jsp 오류는 별로 친절하지 않은 것 같아...

오류 종류만 알려주고 어디서 오류가 난 건지는 알려주지 않잖아...😭😭



⛔ JSP 오류



jsp 하면서 맨날천날 만나는 NullPointerException

차라리 sql 구문 오류 뜨는 게 더 나은 것 같아



NullPointerException 나올 때마다

뭐가 Null이라는 거야 하면서

처음부터 봐도 도저히 오류가 보이질 않더라






대체 어디 값이 안 넘어간 거야...




게시판 목록을 불러오고 싶은데 오류가 나는 거라서

혹시 글 번호랑 페이지 번호가 안 넘어간 건가 싶어서

콘솔창에 출력해봤는데 굳이 콘솔창에 출력할 필요가 없더라?



굳이 콘솔창에 출력 안해도 주소창에서 확인이 가능하다!

주소창 보니까 글 번호랑 페이지 번호 둘 다 잘 넘어갔더라




그럼 뭐가 안 넘어갔지? 할 때!!!!


사용할 수 있는 방법!!!



✔ 오류 해결


글 번호랑 페이지 번호도 잘 넘어갔고

게시판 목록 만드는 페이지에서 따로 빨간 줄 그인 것도 없어서

대체 어디서 오류가 난 건지 알 수가 없었는데


보통 이런 경우는 DAO에서 생긴 오류일 확률이 높댜


그래서 DAO 클래스에서 메서드를 하나하나 보는 데

여기도 빨간줄 그인 게 없어서 대체 왜 오류가 난 건지 알 수가 없었다😇😇



이럴 때!!

위에서 했던 것처럼 콘솔창에 출력해보면 됨!!













근데 뭐를...?






뭐를 출력해야 알 수 있는 거지...?



  1. DTO 객체 출력해보기

제일 먼저 DTO 객체가 제대로 넘어온 게 맞는지 DTO 객체를 출력해보자!


이 방법은 SELECT 구문을 썼을 떄 해보는 거고

SELECT구문을 안 썼다면 바로 2번으로 넘어가기!



while(rs.next()) {
  fileBoardDTO dto = new fileBoardDTO();
  
  dto.setIdx(rs.getInt("idx"));
  dto.setName(rs.getString("name"));
  dto.setPass(rs.getString("pass"));
  dto.setSubject(rs.getString("subject"));
  dto.setContent(rs.getString("content"));
  dto.setOriginal_file(rs.getString("original_file"));
  dto.setReal_file(rs.getString("real_file"));
  dto.setDate(rs.getTimestamp("date"));
  dto.setReadcount(rs.getInt("readcount"));
				
  fileboardList.add(dto);
  System.out.println(dto.toString());
}

toString() 메서드를 이용해서 출력해주면 되는데

나는 여기서 아무것도 안 나왔음...😱😱😱



여전히 NullPointerException 만 콘솔창에 출력됨...


그러면 2번으로 넘어가서 pstmt에서 sql 구문이 제대로 입력됐는지 확인해보면 되는데



그 전에


이 단계에서 찾을 수 있는 오류들!


  1. set으로 열심히 DTO 객체에 있는 값을 넣어놓고 배열에 넣는 걸 깜빡하지는 않았나요?

    • 마지막에 add() 메서드를 통해서 배열에 값을 추가해줘야 함!

      -> 이 경우에도 NullPointerException 오류 발생함!!



  1. 컬럼을 모두 저장한 게 확실한가요?

    • 물론 필요한 것만 저장해서 jsp파일에서 꺼내 쓰면 되는데 만약 저장하지 않았다면??

      -> 이 경우에도 NullPointerException 오류 발생함!!

      -> 모든 값을 넣은 게 맞는지 확인하기!


while(rs.next()) {
  fileBoardDTO dto = new fileBoardDTO();
  
  dto.setIdx(rs.getInt("idx"));
  dto.setName(rs.getString("name"));
  dto.setPass(rs.getString("pass"));
  // dto.setSubject 코드 삭제했음
  dto.setContent(rs.getString("content"));
  dto.setOriginal_file(rs.getString("original_file"));
  dto.setReal_file(rs.getString("real_file"));
  dto.setDate(rs.getTimestamp("date"));
  dto.setReadcount(rs.getInt("readcount"));
				
  fileboardList.add(dto);
  System.out.println(dto.toString());
}

  • 위와 같이 dto.setSubject를 저장하지 않은 경우를 살펴보자!

    이 경우에는 jsp파일에서 메서드를 호출하더라도 setSubject 값이 없기 때문에 코드를 실행했을 경우 NullPointerException 오류가 발생한다


while(rs.next()) {
  fileBoardDTO dto = new fileBoardDTO();
  
  dto.setIdx(rs.getInt("idx"));
  dto.setName(rs.getString("name"));
  dto.setPass(rs.getString("pass"));
  // dto.setSubject 코드도 없고 setContent 코드도 없음
  dto.setSubject(rs.getString("content"));
  dto.setOriginal_file(rs.getString("original_file"));
  dto.setReal_file(rs.getString("real_file"));
  dto.setDate(rs.getTimestamp("date"));
  dto.setReadcount(rs.getInt("readcount"));
				
  fileboardList.add(dto);
  System.out.println(dto.toString());
}

  • 위보다 더 멍청한 경우를 살펴보자!

    이건 내가 했던 실수! 🤬🤬🤬🤬


    dto.setSubject에 당당하게 들어가있는 "Content"

    이건 subject 값도 없고 content 값도 없음...

    있는 게 없는데 jsp파일에서 getXXX()로 호출해서 사용하려고 하면

    당연히 NullPointerException 오류가 발생함...



  1. pstmt에서 sql 구문을 제대로 처리했는지 출력해보기

DTO 객체 값이 안 넘어갔다면 pstmt에서 오류가 났을 확률이 높음!


System.out.println(pstmt);
rs = pstmt.executeQuery();

rs를 실행하기 전(=rs 코드 위)에 println으로 pstmt를 출력해주면 sql 구문이 제대로 적용됐는지 알 수 있다!




그리고 나는 여기서 오류를 찾을 수 있었음!



LIMIT 10, 뒤에



NOT SPECIFIED


너 누구야👀




여기서 내가 썼던 sql 구문을 다시 보면


String sql ="SELECT * FROM fileboard WHERE subject LIKE ? ORDER BY idx DESC LIMIT ?, ?";



오!



마지막 물음표에 들어가는 값에서 문제가 일어났다는 것을 알 수 있다!


드디어 찾았다!

오류 발생 위치!



그러면 pstmt.set에서 뭔가 이상한 게 있다는 건데 뭐라고 썼길래 오류가 났지?



만능문자 순서 번호 마지막에 2 뭐지?

왜 2가 두 번이나 들어가있지?

왜 3번이 없지?



물음표 3번에 값이 없으니까 당연히 NULL 값이 나올 수밖에...



pstmt.setInt(2, listLimit);


pstmt.setInt(3, listLimit);로 고쳐주면 오류 해결 완...







너무 어이없지만


그래도 오류 위치 쉽게 찾을 수 있게 되었으니까

난 그걸로 만족해...





➕ 또 다른 오류 추가


INSERT INTO board VALUES (16,'1','1','1',** BYTE ARRAY DATA **,now(),0)

이건 폼 파라미터 이름이 틀려서 생긴 오류...

jsp파일에서 name 속성값으로 넘겨준 이름이랑 DAO에서 set으로 넣은 이름이 달라서 생긴 오류였음😓😓

profile
개발자가 되었어요⭐️

0개의 댓글