try ~ catch
프로그램 실행 시 에러가 발생했을 때는
에러 메시지를 캐치해서 클라이언트나 개발자에게 알려줘야 하고,
프로그램이 종료되어도 안된다. 에러가 나도 정상 종료해야 한다.
그러기 위해서 사용하는 것이 Try / catch 구문이다.
main/Main.java
package main; // 여기 패키지 메인임.
import model.Student; // 모델에 있는 스튜던트 데리고 온다.
public class Main {
public static void main(String[] args) { // cpu 시작
Student s1 = new Student(); // 메모리에 스튜던트 공간 확보한다.
s1.name = "홍길동";
System.out.println(s1.name);
s1.subjectList.add("자바");
}
}
model/Student.java
package model;
import java.util.ArrayList;
public class Student {
public String name;
public ArrayList<String> subjectList;
}
이렇게만 되어 있으면 "s1.subjectList.add("자바");" 부분에서 오류가 나며 프로그램이 종료되어 버린다.
살펴보면 add 변수만 있지 메모리에서 생성이 안 되었다. 객체 생성을 하지 않고 작업을 하려고 했다.
해결책은 객체 생성을 해 주면 된다.
try catch문을 사용해서 어떤 에러가 나는지 확인도 하고, 프로그램이 종료되지 않도록 셋팅해 줄 수 있다.
main/Main.java
package main; // 여기 패키지 메인임.
import model.Student; // 모델에 있는 스튜던트 데리고 온다.
public class Main {
public static void main(String[] args) { // cpu 시작
Student s1 = new Student(); // 메모리에 스튜던트 공간 확보한다.
try {
// 에러가 날만한 코드가 있는 부분을 try로 둘러 싼다.
s1.name = "홍길동";
System.out.println(s1.name);
s1.subjectList.add("자바");
// 변수만 있지 메모리 생성 안 됨. 객체 생성을 하지 않고 작업을 하려고 했다.
} catch (Exception e) {
// try 부분에서 에러가 발생하면, 원래는 프로그램이 종료된다.
// 하지만 try / catch를 이용하면
// catch에서 프로그램 종료 없이 에러를 처리해 줄 수 있다.
// 유저에게 알려주는 것
System.out.println("고객님, 에러 발생했습니다.");
System.out.println(e.toString());
// 에러 메시지
// java.lang.NullPointerException: Cannot invoke "java.util.ArrayList.add(Object)" because "s1.subjectList" is null
} finally {
// try에서 정상 수행을 했든,
// catch에서 에러가 발생했든,
// 무조건 finally 코드는 실행하는 부분.
// 옵셔널입니다. 있어도 되고 없어도 됨. 파이썬도 마찬가지
System.out.println("finally 실행됨");
}
}
}
model/Student.java
NullPointerException 에러 발생 시 해결하는 방법은 두 가지다.
package model;
import java.util.ArrayList;
public class Student {
public String name;
public ArrayList<String> subjectList = new ArrayList<>(); // ArrayList는 함수다.
}
위 방법은 바로 new 로 이어 공간을 만들어주는 것이다.
두번째 방법은 아래와 같이 생성자를 만들어 주는 것이다.
package model;
import java.util.ArrayList;
public class Student {
public String name;
public ArrayList<String> subjectList; // ArrayList는 함수다.
public Student() {
subjectList = new ArrayList<>();
}
}