Java

Eclipse에서 code가 정상인데 error날 때 해결법

gitblog 2024. 8. 11. 22:05

우선 code가 확실하게 오류가 없는지 체크해야 한다. code를 실행할 때 나오는 Console의 log를 살펴보면 어느 부분의 code에 어떤 문제가 있는지 알 수 있다.

 

아래는 Tomcat으로 servlet을 실행하려고 했는데 나온 error message이다. 한 줄씩 읽어보면 'Syntax error, insert ";" to complete ClassBodyDeclaration'라는 부분을 발견할 수 있다. 해석하면 문장(code) 쓰고 ;을 써야 완성이 되는데 ';'이 빠졌다는 소리다. 그리고 파란색 부분을 클릭하면 해당 error가 발생된 게 의심되는 code로 바로 이동할 수 있다. 보통 가장 첫 번째와 마지막 파란 링크가 실제 error인 경우가 많다. 내 경우엔 at servlet.DemoServlet.<init>(DemoServlet.java:16)가 실제 오류 발생 지점이었다. 해석하면  DemoServlet.java file의 16번째 줄에 문제가 있다는 의미다.

8월 11, 2024 9:09:34 오후 org.apache.catalina.core.StandardWrapperValve invoke

심각: 서블릿 [DemoServlet]을(를) 위해 할당하던 중 예외 발생

java.lang.Error: Unresolved compilation problem:

Syntax error, insert ";" to complete ClassBodyDeclarations

 

at servlet.DemoServlet.<init>(DemoServlet.java:16)

at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:62)

at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:502)

at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:486)

at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:144)

at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:758)

at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:575)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:115)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)

at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)

at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:663)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)

at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)

at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)

at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)

at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:904)

at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)

at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)

at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)

at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)

at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)

at java.base/java.lang.Thread.run(Thread.java:1583)

 

 

하지만 내 경우엔 해당 지점에 문장 자체를 쓰지 않았었다. 즉, 실제로는 code엔 error가 없는데 eclipse가 java source file을 빌드하는 과정에서 문제가 생겨 잘못된 code라고 착각을 한 것이다.

 

해결법은 간단한다. Eclipse 상단 menu의 Project - Clean을 해주면 된다.

 

**Project Clean의 기능**

1. **빌드 결과물 제거**: 프로젝트 클린은 프로젝트의 빌드 결과물, 즉 `.class` 파일, `.jar` 파일, `.war` 파일 등과 같은 컴파일된 파일을 제거한다.
2. **캐시된 데이터 제거**: 프로젝트 클린은 Eclipse가 프로젝트에 대한 캐시된 데이터, 즉 프로젝트의 클래스패스, 라이브러리 등과 같은 데이터를 제거한다.
3. **프로젝트 초기화**: 프로젝트 클린은 프로젝트의 설정과 구성 파일을 초기화한다.

 

웹사이트를 로딩할 때 반복적으로 사용하는 부분은 캐시로 저장해 놓는 것처럼 Eclipse에서도 빌드할 때 반복해서 사용하는 부분은 캐시로 저장을 하고, 생성된 class file도 다시 사용하게 돼있다. 따라서 그 부분에 문제가 생기면 다음 실행 시에도 계속 잘못된 방식으로 빌드된 class file을 사용하게 되므로 정상적인 code도 error로 인지하게 된다.

 

참고로 error가 나지 않더라도 Eclipse가 너무 무거워지지 않도록 가끔씩 Project Clean을 하여 이제 사용하지 않게 된 임시파일을 제거해 주는 것이 좋다.