java.lang.NoClassDefFoundError: org/apache/jsp 에러에 대해서 알아보자


결론부터 말하자면 jsp파일을 컴파일 하고 저장된 java파일과 class파일의 이름이 jsp파일의 이름을 바꿨는데도 시스템에서 수정되지 않아 생기는 오류이다.

에러를 자세히 보면 jsp 폴더 안에 있는 board/boardWrite_jsp 파일이 wrong name: org/apache/jsp/board/BoardWrite_jsp 

즉,  잘못된 이름의 파일이 저장되어 있다는 뜻으로 해석 가능하다. 이를 해결하기 위해 



서버를 더블 클릭 한뒤



그림과 같이 Open launch configuration을 클릭.



Arguments를 클릭 한 뒤 Dctalina. base나 Dctalina.home 의 파일 경로를 복사 한뒤 파일을 열어 붙여 넣기 한다.

그러고 난뒤 work->Catalina -> localhost -> 자신이 하고 있는 프로젝트명의 파일 -> org -> apache -> jsp  순으로 파일을 이동한다.

C:\Users\kim\Downloads\apache-tomcat-9.0.10\apache-tomcat-9.0.10\work\Catalina\localhost\start_project\org\apache\jsp

    빨간색 글자로 표시한 부분이 각자의 파일을 차이점이 될 것이다. 
이제 jsp 파일안에 들어있는 java파일과 class파일들을 삭제한뒤 다시 컴파일을 실행시키면 오류가 해결 될 것이다.


java.lang.NullPointerException 에러는 무엇인가?


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import java.util.Scanner;
 
public class Main {
   static Integer[][] arr = new Integer[3072][6143];
    
   public static void main(String[] args) {
       Scanner sc = new Scanner(System.in);
       int num = sc.nextInt();
       star(num-1,0,num);
       for(int i=0; i<num; i++) {
           for(int j=0; j<2*num-1; j++) {
               if(arr[i][j]==1) {
                   System.out.print("*");
               }else {
                   System.out.print(" ");
               }
           }
           System.out.println();
       }
   }
   static void star(int x, int y, int size) {
       if(size==3) {
           arr[y][x] = 1;
           arr[y+1][x-1= 1;
           arr[y+1][x+1= 1;
           
           arr[y+2][x+2= 1;
           arr[y+2][x+1= 1;
           arr[y+2][x] =1;
           arr[y+2][x-1=1;
           arr[y+2][x-2=1;
       }else {
           size /= 2;
           star(x,y,size);
           star(x-size,y+size,size);
           star(x+size,y+size,size);
       }
   }
}
 
cs


이와 같이 12번 째 줄에 NullPointerException 예외가 발생된다.

이를 해결하고자 구글에 NullPointerException 에러를 검색해봤다. 


---------------------------------------------------------------------------------------------------------------------------------------------------------------


레퍼런스 변수를 선언하면 객체의 포인터가 생성됩니다. 즉, 레퍼런스 변수는 객체의 주소 (참조값)을 저장합니다. 프리티미트 타입 (기본 타입)인 int 타입의 변수를 다음과 같이 선언한다고 가정해보면:

int x; x = 10;

이 예제의 첫번째 명령문에서 변수 x는 int 타입으로 선언되어, 자바는 이 변수의 값을 0으로 초기화합니다 (단, 변수 x가 클래스의 필드로 정의되었을 때). 그리고 두 번째 명령문과 같이 해당 변수 x에 10이라는 값을 대입 연산자를 사용하여 할당하면, 변수 이름 x가 가리키는 메모리 위치에 10이라는 값이 쓰여집니다.

그러나 레퍼런스 타입의 변수를 선언할 때는 다르게 처리됩니다. 다음의 코드를 살펴보면:

Integer num;

num = new Integer(10);

첫번째 명령문에서 num이라는 이름으로 선언된 변수는 프리미티브 값을 저장하지 않습니다. 대신, Integer라는 이름의 타입은 래퍼클래스로서, 레퍼런스타입이므로 해당 변수는 주소 (참조값)을 저장합니다. 첫번째 명령문은 아직 어떤 것을 참조하라고 정의하지 않았기 때문에 자바는 그 변수를 null로 초기화합니다 (단, 변수 num이 클래스의 필드로 정의되었을 때). 이것은 "나는 아무것도 참조하지 않아"라는 의미입니다.

두 번째 명령문은 new라는 키워드를 사용해서 Integer 클래스 객체를 생성하고 해당 객체의 주소 (참조값을) num이라는 변수에 저장합니다. 이렇게 객체를 생성하고 객체의 참조값을 저장한 변수를 사용해서 해당 객체에 접근할 수 있습니다. 이 때, . 연산자를 사용합니다.

만약 레퍼런스 타입의 변수를 선언하고 객체를 생성하지 않으면 (즉, 객체의 참조값을 해당 변수에 저장하지 않으면) Exception이 발생됩니다. 즉, 객체가 생성되기 전에 num 변수를 사용해서 해당 클래스의 객체를 접근하고자 하면 NullPointerException이 발생됩니다. 이러한 경우 대부분 컴파일러가 해당 문제를 인식해서 경로 메시지로 알려줄 것입니다. "num 변수가 아직 초기화되지 않았어"라고요.

아래와 같은 메소드에 대해서,

public void doSomething(Integer num) { // do something to num }

다음과 같이 호출한다면,

doSomething(null);

num 변수의 값은 null이 됩니다. 이러한 null 값을 가지는 num 변수를 사용해서 객체의 필드 혹은 메소드에 접근하고자 한다면 NullPointerException이 발생하게 되는 것입니다. 이와 같은 exception이 발생되지 않게 하는 최선의 방법은 다음과 같이 레퍼런스 변수를 사용하기 전에 null 값을 저장하고 있는지를 체크하는 것입니다.

public void doSomething(Integer num) { if(num != null) { // do something to num } }

-------------------------------------------------------------------------------------------------------

12번째줄의

if(arr[i][j]==1)를 if(arr[i][j]!=null) 로 고치니 문제가 해결됬다.


'프로그래밍 > JAVA' 카테고리의 다른 글

싱글턴 패턴 사용하는 이유  (0) 2019.01.06
abstract와 Interface  (0) 2019.01.04
public static void main(String[] args)  (0) 2018.11.22
java exe 파일 만들기  (0) 2018.09.01
자바 OutputStream 줄바꿈  (0) 2018.08.31

 셀프 넘버




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import java.util.ArrayList;
import java.util.Collections;
 
public class Main {
    public static void main(String[] args){
        ArrayList<Integer> list = new ArrayList<Integer>();
        for(int i=0; i<=10000; i++) {
            list.add(self_num(i));
            
        }
        Collections.sort(list);
        for(int i=0; i<=10000; i++) {
            if(!(list.contains(i))) {
                System.out.println(i);
            }
        }
    }
    static int self_num(int num) {
        int sum=0;
        String st_num = String.valueOf(num);
        sum+=num;
        for(int i=0; i<st_num.length(); i++) {
            sum+=Integer.parseInt(String.valueOf(st_num.charAt(i)));
        }
        return sum;
    }
}
 
 
cs


'백준 알고리즘 > JAVA' 카테고리의 다른 글

자바 백준 1764번 듣보잡  (1) 2018.09.02
자바 백준 5585번 거스름돈  (0) 2018.09.02
자바 백준 7568번 덩치  (1) 2018.08.25
자바 백준 1065번 한수  (0) 2018.08.23
자바 백준 2231번 분해합  (0) 2018.08.23

+ Recent posts