- <name> 태그 아래의 <url>은 프로젝트의 주소를 입력하는 곳인데 일반적으로 잘 사용하지 않습니다.
<properties> 태그는 속성을 정의합니다.
<properties> 가 감싸고 있는 부분은 자바 버전, 자바의 환경변수를 세팅합니다.
태그의 이름은 사용자가 임의로 지을 수 있습니다.
<!-- 현재 프로젝트에 필요한 속성을 정의하는 태그-->
<properties>
<java-version>17</java-version>
<java-home>${env.JAVA_HOME}</java-home>
<!-- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> defualt -->
</properties>
그리고 <properties> 태그 위 아래로 두 칸씩, 사용자 정의 속성과 Encoidng은 1칸씩 공백을 두어 가독성을 높입니다.
모든 Error와 Exception은 java.lang.throwable에 의해 만들어집니다.
Exception은 Cheched Exception(일반 예외)과 Runtime Exception(실행 예외)이 있는데,
Checked Exception은 컴파일러가 사용자에게 알려주지만 RuntimeException은 관여하지 않기 때문에 유의해야 합니다.
□ Runtime Exception
Runtime Exception은 Exception 처리 코드를 생략하더라도 컴파일이 되는 Exception을 뜻합니다.
다음은 Runtime Exception의 대표적인 종류입니다.
NullPointerException
ArrayIndexOutOfBoundsException
ClassCastException
NumberFormatException
1. NullPonterException
NullPonterException은 객체 참조가 없는 상태에서의 Exception입니다.
null 값을 갖는 참조 변수로 객체 접근 연산자인 도트(.)를 사용했을 때 발생합니다.
다음은 예시 코드입니다.
@Log4j2
public class NullPointerException {
public static void main(String[] args) {
// String data = null;
// log.info(data.toString());
} // main
} // end class
위의 코드를 실행하면 아래와 같은 오류 코드가 발생합니다.
첫번 째 줄에서 왼쪽은 Exception 이름, 오른쪽은 Exception이 발생하게 된 이유입니다.
두번 째 줄은 Stack Trace입니다.
Stack Trace은 프로그램의 실행 경로를 역순으로 나열해서 콘솔 뷰에서 보여주는데,
Bottom-Up으로 읽은게 일반적이며, Runtime Exception을 처리할 때 사용됩니다.
2. ArrayIndexOutOfBoundsException
ArrayIndexOutOfBoundsException은 배열에서 인덱스 범위를 초과해서 사용할 경우 발생합니다.
다음은 예시 코드입니다.
@Log4j2
public class ArrayIndexOutOfBoundsException {
public static void main(String[] args) {
if(args.length == 2) {
String data1 = args[0];
String data2 = args[1];
String data3 = args[2];
log.info("args[0] : ", data1);
log.info("args[1] : ", data2);
log.info("args[2] : ", data3);
} else {
log.info("[ 실행 방법 ]");
log.info("java ArrayIndexOfBoundsException ");
log.info("값1 값2");
} // if - else
} // main
} // end class
args의 배열 길이가 2일 경우에만 log.info로 출력하게 하였고,
그 외의 경우는 실행 방법을 출력해서 예외 처리를 하였습니다.
위의 코드를 컴파일할 경우 다음과 같은 오류 코드가 발생합니다.
3.ClassCastException
ClassCastException은 타입 변환이 되지 않을 경우 발생합니다.
다음은 예시 코드입니다.
@Log4j2
public class ClasscastException {
public static void main(String[] args) {
Dog dog = new Dog();
ClasscastException.chageDog(dog);
Cat cat = new Cat();
ClasscastException.chageDog(cat);
} // main
public static void chageDog(Animal animal) {
if(animal instanceof Dog) {
Dog dog = (Dog) animal; // ClassCastException 발생 가능
} else if(animal instanceof Cat) {
Cat cat = (Cat) animal;
} else {
throw new IllegalArgumentException(String.format("값이 잘못 들어왓습니다."));
}
} // changeDog
} // end class
class Animal{;;}
class Dog extends Animal{;;}
class Cat extends Animal{;;}
changeDog 메서드는 Animal 타입의 파라미터를 받고 각 파라미터의 타입을 instanceof로 비교해서 맞는 타입으로 변환합니다.
위의 코드는 문제가 없지만 만약 Cat으로 변환하는 else가 없다면 ClassCastException이 발생합니다.
ClassCastException이 발생할 경우 IlleageArgumentException을 발생시켜 값이 잘못 들어왔음을 알려줍니다.
4. NumberFormatException
NumberFormatException은 데이터 타입의 타입 변환이 불가할 때 발생합니다.
다음은 예시 코드입니다.
@Log4j2
public class NumberFormatException {
public static void main(String[] args) {
// 최초 입력 데이터는 문자열
String data1 = "100";
String data2 = "a100";
// 위의 문자열 중, 숫자 형태의 문자열을 Int타입으로 변경
int value1 = Integer.parseInt(data1);
int value2 = Integer.parseInt(data2);
int result = value1 + value2;
log.info("{} + {} + = {}", data1, data2, result);
} // main
} // end class
위의 코드를 실행시키면 NumberFormatException이 발생합니다.
a100에 문자 'a'가 있기 때문에 NumberFormatException이 발생했으며, 콘솔에서도 확인할 수 있습니다.
- Eclipse, VScode, Idea ( eclipse-java, vscode, idea ), 개발 환경에 맞는 도구 선택 - 코레토 ( corretto-jdk, 자바 킷 ), 테무린 ( temurin-jdk, 자바 킷) 등, 필요에 따라 search로 버전 검색 후 설치 - VisualVM( 애플리케이션 모니터링 툴 ), VisualVM 설치방법 - JMC( Java Mission Control, 오라클 자바 진단 툴 ) - scoop install jmc
scoop은 git을 통해 프로그램 버전 관리를 하기 때문에 git을 먼저 설치해야 합니다.
설치가 완료되면 Notes가 뜨는데,
Notes는 사용자가 작업해야 하는 목록들을 보여줍니다.
위의 화면에서는 다음과 같은 명령어가 있습니다.
Set Git Credential Manager Core by running: "git config --global credential.helper manager"
To add context menu entries, run 'C:\app\scoop\apps\git\current\install-context.reg'
To create file-associations for .git* and .sh files, run 'C:\app\scoop\apps\git\current\install-file-associations.reg'
scoop에서 설치 가능한 모든 패키지 목록을 제공합니다. 만약 특정 프로그램을 검색하고자 한다면 search 뒤에 프로그램 이름을 입력하면 됩니다. 예를 들어, "scoop search corretto" "scoop search eclipes" 뒤에 붙인 단어를 포함하는 모든 패키지 목록를 제공하게 됩니다.
scoop install, uninstall 이름 :
search를 통해 찾은 패키지의 이름을 입력하면 설치, 삭제할 수 있습니다.
scoop update :
scoop과 설치된 패키지들을 업데이트합니다. update 뒤에 패키지 이름을 붙여 특정 패키지만 업데이트할 수 있습니다.
객체 참조가 없는 상태, null 값을 갖는 참조변수로 객체 접근 연산자인 도트(.)를 사용했을 때 발생합니다.
첫 줄을 보시면 예외의 타입, 예외의 원인을 보여주고 있습니다.
두번째 줄은 stacktrace입니다.
stacktrace는 시스템에서 보내는 오류 메세지인데, 예외가 발생한 시점에서의 메소드 호출 스택을 보여줍니다.
stacetrace가 길어지면 호출의 흐름을 Bottom-Up으로 읽는게 일반적입니다.
그렇다면 위의 메세지에서의 메소드 호출 스택은 "NullPointerException.java:12" 이 됩니다.
즉, "data"가 "null"이므로 String.toString()을 invoked(호출)할 수 없다는 뜻입니다.
2. ArrayIndexOutOfBoundsException
배열에서 인덱스 범위를 초과해서 사용할 경우 발생합니다.
Run Configuration에서 args에 값을 넣어주지 않으면 else에서 예외를 처리하게 됩니다.
args에 값을 할당하게 되면 정상적으로 동작합니다.
3. ClassCastException
형 변환이 잘못되었을 때 발생합니다.
위의 코드에서 Dog 타입의 dog를 changeDog 메서드의 Animal 타입 파라미터로 던져주고,
changeDog 메서드는 instanceof로 받은 파라미터가 Dog 타입인지 확인합니다.
이후 Dog 타입이면animal 타입의 파라미터인 dog를 Dog타입으로 강제 형 변환합니다.
만약 Cat 타입의 cat 객체가 changeDog 메서드의 파라미터로 던져지게 되면, instanceof에서 필터링하고
changeDog 메서드에서 cat의 강제 형변환이 실행되지 않게 됩니다.
만약 cat도 강제 형 변환을 하고 싶다면 다음과 같이 코드를 작성할 수 있습니다.
@Log4j2
public class ClasscastException {
public static void main(String[] args) {
Dog dog = new Dog();
ClasscastException.chageDog(dog);
Cat cat = new Cat();
ClasscastException.chageDog(cat);
} // main
public static void chageDog(Animal animal) {
if(animal instanceof Dog) {
Dog dog = (Dog) animal; // ClassCastException 발생 가능
} else if(animal instanceof Cat) {
Cat cat = (Cat) animal;
} else {
throw new IllegalArgumentException(String.format("값이 잘못 들어왓습니다."));
}
} // changeDog
} // end class
class Animal{;;}
class Dog extends Animal{;;}
class Cat extends Animal{;;}
4. NumberFormatException
data1은 문자열 타입의 숫자라서 Integer.parseInt로 타입 변환이 가능하지만,
data2는 문자 a가 섞여 있어서 Int로의 타입 변환이 불가능합니다.
위 코드를 실행하면 다음과 같은 오류 메세지가 출력됩니다.
이러한 Eception들은 try-catch-finally 블록을 이용해서 Exception 코드를 처리할 수 있습니다.