열심히 끝까지

[예외발생노트] - 예외 발생 시 매번 생성 본문

디바이스 융합 자바(Java)기반 풀스택 개발자 양성과정(과제)

[예외발생노트] - 예외 발생 시 매번 생성

노유림 2022. 9. 29. 15:58

--------------------------------------------------22.6.8(수요일)

숫자입력란에 문자를 입력하면서 생긴 예외
문자열에 사이띄우기를 하면서 입력하면 입력되지 못한 나머지 문자값과 엔터가 정수에 입력되면서 올바르지 않은 입력값이라는  예외 출력

Exception int thread "main" java.util.InputMismatchException

: 문자열에 사이띄우기를 하면서 입력하면 입력되지 못한 나머지 문자값과 엔터가 정수에 입력되어 

  올바르지 않은 입력값이라는 예외 출력

 

------------------------------------------------22.6.10(금요일)

배열의 인덱스의 번호보다 큰 값을 부르면서 생긴 문제, int 0으로 바꿔주면 문제는 해결(인덱스는 0부터 시작)

 

 

------------------------------------------------22.6.13(월요일)

if의 i값에 1을 추가하게 되면 원래의 data배열이 가지고 있는 인덱스값보다 더 커지기 때문에 인덱스를 벗어났다는 예외 출력

 

------------------------------------------------22.6.14(화요일)

n의 최소값을 지정해 주지 않으면 숫자가 감소하는데 음수가 되도 끝나지 않고 계속 감소, 그 스택의 메모리가 끝나지 않는 숫자로 가득 차서    과부화가 걸린 모습 + 에러

Exception in thread "main" java.lang.StackOverFlowError

: 최소값을 지정해주지 않아 음수가 되도 끝나지 않아 메모리 오버플로우 발생

 

------------------------------------------------22.6.24(금요일)

package class02;
public class Test02 {
	public static void main(String[] args) {
		int[] data = {1, 2, 3};
		System.out.println(data[3]);
	}
}

 

위 코드의 예외로 data의 크기보다 큰 인덱스값을 출력해달라고 해서 그렇다

java.lang.ArrayIndexOutOfBoundsException : Index 3 out of bounds for length 3

>> 올바르지 않은 길이값을 호출해서 나온 결과

package class02;
import java.util.Scanner;
public class Test02 {
	public static void main(String[] args) {
		int[] data = {1, 2, 3};
		Scanner sc = new Scanner(System.in);
		System.out.print("인덱스 넘버 입력) ");
		int num = sc.nextInt();
		try {
			System.out.println("AAA");
			// 예외가 발생할만한 구간을 설정
			System.out.println(data[num]); 
			// 예외는 발생 즉시 try -> catch로 즉시 이동!
			System.out.println("BBB");
		}
		catch(ArrayIndexOutOfBoundsException e) {
			System.out.println("0이상 "+data.length + "미만 까지만 입력해주세요!");
			// 예외처리는 
			// 1. 무슨 에러였는지(개발자)
			// 2. 어떻게 해야하는지(사용자)
			e.printStackTrace(); // 메서드를 통해서 어떤 에러였는지 알려준다!
		}
	}
}

AAA가 출력되고 입력받은 숫자의 인덱스의 크기가 맞지 않자 catch문으로 이동하여 예외처리 + 예외가 생긴 줄의 아래는 실행하지 않은    것이 눈에 보인다.

 

package class02;
import java.util.Scanner;
public class Test03 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int a = sc.nextInt();
		int b = sc.nextInt();
		try {
			System.out.println(a/b);
		}
		catch(ArithmeticException e) { // 예외에 맞게 예외처리를 해야한다!
			System.out.println("0으로는 나눌 수 없습니다!");
		}
		catch(ArrayIndexOutOfBoundsException e) {
			System.out.println("인덱스넘버를 다시 확인해보세요.");
		}
		System.out.println("프로그램...");
	}
}

예외처리를 하기 이전, 0으로 나누려고 하면 0으로 10을 나눌 수 없다는 예외문구가 출력된다!

Exception in thread "main" java.lang.ArithmeticException : / by zero

예외처리를 하지 않은 채 0으로 나누려고 하면 에러가 걸림

 

------------------------------------------------22.7.4(월요일)

DESC를 DES로 쓰는 이상한 짓을 했습니다... ...오타 내지말아라!!!!!!!

ORA-00907 : missing right parenthesis 

: 오타 중 하나

-----------------------------------------------22.8.1(월요일)

; 안써줘서 발생

 

POST 방식이라고 지정해주어야 함

해결책------

(36일차에도 쓰지만 여기에도 기재할 것)

POST로 지정하는 방법

>> GET 으로 바꾸면 겹치기 때문에 올바른 것을 만나기 힘듦

 

-----------------------------------------------22.8.2(화요일)

17번 행에 apple을 숫자로 바꾸려고 한 로직의 에러가 존재하기 때문에 발생

org.apache.jasper.JasperException

>> 애초에 에러를 발생시키기 위해 만든 페이지

 

-----------------------------------------------22.8.20(토요일)

Several ports(8005, 8088) required by Tomcat v9.0 Server at localhost are already in use.

The server may already be running in another process, or a system process may be using the port.

To start this server you will need to stop the other process or change the port number(s).

>> 프로그램이 강제종료되서 포트번호가 계속 살아있는 상황

     >> 이 때, cmd 켜서  

           1. netstat -a -n -o -p tcp 실행

           2. 포트 번호 찾아서 그 포트번호 kill

                 > taskkill /f /pid 포트번호

           3. 그러고 실행!

 

 

-----------------------------------------------22.9.14(수요일)

SQLSyntaxErrorException : ORA-00904: "WIRTER" : invalid identifier  

: WRITER 오타 냄

 

-----------------------------------------------22.9.15(목요일)

applicationContext.xml의 printLog 오타

   >> printlog로 작성했었음

 

-----------------------------------------------22.9.21(수요일)

>>> Servlet.init() 호출 예외

javax.servlet.ServletException: 서블릿 [DispatcherServlet]을(를) 위한 Servlet.init() 호출이 예외를 발생시켰습니다.
	org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
	org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
	org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:687)
	org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360)
	org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399)
	org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
	org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:890)
	org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1787)
	org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
	org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
	org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	java.base/java.lang.Thread.run(Thread.java:834)
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping': Initialization of bean failed; nested exception is java.lang.IllegalStateException: Cannot map handler 'mypageController' to URL path [/mypage.do]: There is already handler of type [class com.ryo.biz.controller.MemberController] mapped.
java.lang.IllegalStateException: Cannot map handler 'mypageController' to URL path [/mypage.do]: There is already handler of type [class com.ryo.biz.controller.MemberController] mapped

>> 에러의 이유는 중복으로 설정한 mypage.do 때문

package com.ryo.biz.controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.stereotype.Controller;
import org.springframework.web.servlet.ModelAndView;

import com.ryo.biz.member.MemberVO;
import com.ryo.biz.member.impl.MemberDAO;

@Controller
public class MypageController /*implements Controller */{

	@RequestMapping("/mypage.do")
	public ModelAndView handleRequest(MemberVO mVO, MemberDAO mDAO, ModelAndView mav) {

		mVO = mDAO.selectOneMember(mVO);

		mav.addObject("member", mVO);
		mav.setViewName("mypage.jsp");
		return mav;
	}
}

이 사항을 memberController에서 또 지정해줘서 충돌난 것

@RequestMapping("/mypage.do")
public ModelAndView mypage(MemberVO mVO, MemberDAO mDAO, ModelAndView mav) {

	mVO = mDAO.selectOneMember(mVO);

	mav.addObject("member", mVO);
	mav.setViewName("mypage.jsp");
	return mav;
}

 -- MypageController의 RequestMapping을 지워주면 해결

 

 

-----------------------------------------------22.9.26(월요일)

>> Could not publish server configuration for Tomcat v9.0 Server at localhost.
     Multiple Contexts have a path of "/app"
>>>> Servers > server.xml


// 여기서 잘못된 것
<Context docBase="test2" path="/" reloadable="true" source="org.eclipse.jst.jee.server:test2"/>

<Context docBase="test" path="/app" reloadable="true" source="org.eclipse.jst.jee.server:test"/></Host>

Path 파일 확인해볼 것!! Path = "/" 으로 설정할 것 

 

-----------------------------------------------22.9.28(수요일)

Incorrect result size: expected 1, actual 0

>> queryForObject() 메서드는 무조건 1개의 output을 필요로 하는데

     output값을 받지 못하거나 너무 많이 받아서 발생한 일

 

1. try/catch로 잡기

2. query()로 변경해서 해결

자세한 사항은 [코딩 문제 - jdbcTemplate.queryForObject() 관련 문제] 에 기제

 

-----------------------------------------------22.9.29(목요일)

javax.servlet.ServletException: javax.servlet.jsp.JspTagException: No message found under code 'message.sign.h2' for locale 'ko_KR'.
   org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:657)
   org.apache.jsp.signin_jsp._jspService(signin_jsp.java:259)
   org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
   javax.servlet.http.HttpServlet.service(HttpServlet.java:764)
   org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:466)
   org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:379)
   org.apache.jasper.servlet.JspServlet.service(JspServlet.java:327)
   javax.servlet.http.HttpServlet.service(HttpServlet.java:764)
   org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
근본 원인 (root cause)

javax.servlet.jsp.JspTagException: No message found under code 'message.sign.h2' for locale 'ko_KR'.
   org.springframework.web.servlet.tags.MessageTag.doEndTag(MessageTag.java:200)
   org.apache.jsp.signin_jsp._jspx_meth_spring_005fmessage_005f0(signin_jsp.java:282)
   org.apache.jsp.signin_jsp._jspService(signin_jsp.java:165)
   org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
   javax.servlet.http.HttpServlet.service(HttpServlet.java:764)
   org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:466)
   org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:379)
   org.apache.jasper.servlet.JspServlet.service(JspServlet.java:327)
   javax.servlet.http.HttpServlet.service(HttpServlet.java:764)
   org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)

 

>> 언어 처리(다국어 처리)는 DispatcherServlet-servlet.xml를 거쳐서 진행

     그렇기에 insert.do 혹은 main.do, signup.do 와 같이 xxx.do로 끝나면 다국어처리가 가능

     >>> 하지만 insert.jsp와 같이 다이렉트로 이동하려고 하면 적용되지 않고 에러를 띄움

   >> 그렇기에 다이렉트로 이동하는지, 아니면 DispatcherSerlvet의 do를 통해 진행되는지 확인할 것