우선 자바에서 예외 클래스는 두가지가 있다.
(1) Checked Exception, (2) Unchecked Exception
Checked Exception은 알고 있는대로, 처리를 해주지 않으면 컴파일 타임에서부터
오류가 발생하고, 반드시 try-catch를 하거나 명시적으로 throws로 상위 메서드로 전파시켜서 처리를 해야한다.
Unchecked Exception은 컴파일 타임에서 오류가 발생하지 않으며, 명시적으로 throws 지정을 하지 않더라도 자동으로 상위 메서드로 전파가 된다.(이게 스프링부트 기능인줄 알았다)
다만, 마찬가지로 어디에서도 try-catch로 예외를 처리해주지 않으면 결국엔 프로그램이 종료된다.
대표적인 Unchecked Exception 클래스는 Runtime Exception이 있으며 나머지들은 이 클래스를 상속받는다.
public class BizException extends RuntimeException {
public BizException(String msg){
super(msg);
}
public BizException(Exception ex){
super(ex);
}
}
public class ExceptionExam3 {
public static void main(String[] args) {
int i = 10;
int j = 0;
try{
int k = divide(i, j);
System.out.println(k);
}catch(IllegalArgumentException e){
System.out.println("0으로 나누면 안됩니다.");
}
}
public static int divide(int i, int j) throws IllegalArgumentException{
if(j == 0){
throw new IllegalArgumentException("0으로 나눌 수 없어요.");
}
int k = i / j;
return k;
}
}
public int divide(int i, int j) throws IOException, Exception {...}
public class ExceptionExam2 {
public static void main(String[] args) {
int i = 10;
int j = 0;
try{
int k = divide(i, j);
System.out.println(k);
} catch(ArithmeticException e){
System.out.println("0으로 나눌수 없습니다.");
}
}
public static int divide(int i, int j) throws ArithmeticException{
int k = i / j;
return k;
}
}
public class ExceptionExam {
public static void main(String[] args) {
int i = 10;
int j = 0;
try {
int k = i / j;
System.out.println(k);
} catch (ArithmeticException e){
System.out.println("0으로 나눌 수 없습니다. : " + e.toString());
} catch (Exception e){
System.out.println("모든 오류 처리가 가능합니다. : " + e.toString());
} finally {
System.out.println("오류가 발생하든 안하든 무조건 실행되는 블록입니다.");
}
}
}
public class InnerExam1{
class Cal{
int value = 0;
public void plus(){
value++;
}
}
public static void main(String args[]){
InnerExam1 t = new InnerExam1();
InnerExam1.Cal cal = t.new Cal();
cal.plus();
System.out.println(cal.value);
}
}
public class InnerExam2{
static class Cal{
int value = 0;
public void plus(){
value++;
}
}
public static void main(String args[]){
InnerExam2.Cal cal = new InnerExam2.Cal();
cal.plus();
System.out.println(cal.value);
}
}
public class InnerExam3{
public void exec(){
class Cal{
int value = 0;
public void plus(){
value++;
}
}
Cal cal = new Cal();
cal.plus();
System.out.println(cal.value);
}
public static void main(String args[]){
InnerExam3 t = new InnerExam3();
t.exec();
}
}
//추상클래스 Action
public abstract class Action{
public abstract void exec();
}
//추상클래스 Action을 상속받은 클래스 MyAction
public class MyAction extends Action{
public void exec(){
System.out.println("exec");
}
}
//MyAction을 사용하는 클래스 ActionExam
public class ActionExam{
public static void main(String args[]){
Action action = new MyAction();
action.exec();
}
}
//MyAction을 사용하지 않고 Action을 상속받는 익명 클래스를 만들어서 사용하도록 수정해 보도록 하겠습니다.
public class ActionExam{
public static void main(String args[]){
Action action = new Action(){
public void exec(){
System.out.println("exec");
}
};
action.exec();
}
}
static 키워드를 붙이면 클래스 레벨에 속하는 메서드가 된다.
'클래스명.메서드명'과 같이 호출이 가능하다.
인스턴스로부터 호출도 할 수 있다.
static 키워드를 붙이면 클래스 레벨에 속하는 메서드가 된다.
'클래스명.메서드명'과 같이 호출이 가능하다.
인스턴스로부터 호출은 불가능하다.