안녕하세요.


게임 도중에 인풋박스를 취소하거나, 아무것도 안적고 확인을 누르면 아래와 같은 에러가 뜨는데 해결책을 찾아보도록 합시다. (엄밀히 말하면 두 경우 에러메세지 내용이 조금 다르지만 대표로 한 이미지만 올려둡니다)










에러가 나는 이유를 분석하기 전에, 일단 코드를 아래와 같이 수정해주세요.



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
41
42
43
44
45
46
47
48
// Study01.java
 
package study;
 
import javax.swing.JOptionPane;
 
public class Study01 {
 
    public static void main(String[] args) {
 
        // 슬라임과 인간 객체 생성
        Slime s1 = new Slime("슬라삐");
        Slime s2 = new Slime("슬라디");
        Human h = new Human("알렉스");
 
        System.out.println(s1.name + "와 " + s2.name + "가 나타났다! 당신의 이름은 " + h.name + "이다\n");
 
        while (true) {
 
            // 인풋박스
            String sTarget = JOptionPane.showInputDialog("어느 슬라임을 공격하겠습니까? 1은 " + s1.name + " 2는 " + s2.name);
            
            int target = Integer.parseInt(sTarget);
 
            if (target == 1) {
 
                // 인간의 공격
                h.attack(s1);
 
                // 슬라임의 반격
                s1.attack(h);
 
            } else if (target == 2) {
 
                h.attack(s2);
                s2.attack(h);
 
            } else {
 
                JOptionPane.showMessageDialog(null"올바른 숫자를 입력하세요");
 
            }
 
        } // while 끝
    }
 
}
 
cs


21~23행을 잘보세요. 기존에는 인풋박스 내용을 형변환해서 변수에 집어넣은 것까지 한줄로 처리했습니다만, 일단 스트링 변수에 넣고 형변환하는 식으로 두줄로 쪼개놨습니다. (다른 부분은 건드리지 않았습니다)


이 상태에서 실행을 하고 취소버튼을 눌러보시기 바랍니다.






맨처음 에러가 유발된 부분이 맨밑에 적혀있습니다. 23행에서 에러가 시작됐다고 돼있네요. 23행은 형변환하는 코드가 있는 부분이네요.


에러가 왜 나는지 짐작이 가시나요?


인풋박스를 취소를 하게 되면 sTarget 변수에 아무런 값도 들어가지 않습니다. 이걸 null(널) 상태 또는 null값이 들어갔다고 표현합니다. (에러메세지 맨 윗줄의 맨 오른쪽을 보시면 null이라고 적혀있죠?) 아무런 값이 없으니 형변환이 불가능한게 당연한거죠.


이번에는 인풋박스에 아무것도 안적고 확인을 눌러봅시다.








이번에도 형변환하다가 에러가 났네요. null이 적혀있던 자리에 "" 이게 적혀있네요. 따옴표속에 아무것도 안적혀있다는, 다시말해 빈값이 입력됐다는 것이죠. 빈값이 형변환 안되는 것도 당연한 사실입니다.





갑자기 혼란스러우신가요? 변수에 아무런 값도 안들어간거랑 빈값이 들어간거랑 도대체 무슨 차이냐고 반문하시는 분이 계실듯 합니다. 비유를 하자면 전자렌지에 아무것도 안넣은 거랑 빈접시를 넣은 것의 차이랄까요? 아무튼 두 경우 다 그 상태에서 전자렌지를 작동시키는 행동은 에러겠죠.


이렇게해서 에러가 나는 원인은 찾았습니다. 다음 시간에는 에러 해결을 해보도록 하겠습니다.


감사합니다.

+ Recent posts