1. 주석문
JavaDoc주석문에는 annotaion 사용
[코드]
/**
* 책 한권의 정보를 담기 위한 클래스
*
* @author urstory(<a href="mailto:urstory@gmail.com">김성박</a>)
* since 2022.03
* version 0.1
*/
public class Book { ... }
2. 예외문(Exception)
Error와 Exception
= 비정상적으로 프로그램을 종료되게 하는 원인
- Error: 수습할 수 없는 심각한 오류
· 컴파일 에러: 컴파일시 발생하는 에러
· 런타임 에러: 실행시 발생하는 에러
- Exception: 예외처리를 통해 수습할 수 있는 덜 심각한 오류
[코드]
public class Exception1 {
public static void main(String[] args) {
ExceptionObj1 exobj = new ExceptionObj1();
int value = exobj.divide(10,0);
System.out.println(value);
}
}
class ExceptionObj1{
public int divide(int i, int k){
int value = 0;
value = i/k;
return value;
}
}
Exception in thread "main" java.lang.ArithmeticException: / by zero
value = i/k; 에서 오류 발생 → 10/0은 불가능하기 때문
1) 예외 처리하기 (try-catch)
try{
코드1
코드2
......
} catch(Exception클래스명1 변수명1){
Exception을 처리하는 코드
} catch(Exception클래스명1 변수명1){
Exception을 처리하는 코드
}
[코드]
public class Exception1 {
public static void main(String[] args) {
ExceptionObj1 exobj = new ExceptionObj1();
int value = exobj.divide(10,0);
System.out.println(value);
}
}
class ExceptionObj1{
public int divide(int i, int k){
int value = 0;
try {
value = i / k;
}catch(ArithmeticException ex){
System.out.println("0으로 나눌수 없어요.");
System.out.println(ex.toString());
}
return value;
}
}
출력
문제점: 10/0은 0이아닌데 결국 기본 value값인 0이 출력 → 틀린 값이 return됐으므로 더 큰 문제 발생
2) 예외 떠넘기기(throws)
리턴타입 메소드면 (아규먼트 리스트) throws Exception클래스명1, Exception클래스명2 ...{
코드1
코드2
.....
}
[코드]
public class Exception1 {
public static void main(String[] args) {
ExceptionObj1 exobj = new ExceptionObj1();
try {
int value = exobj.divide(10, 0);
System.out.println(value);
}catch (ArithmeticException ex){
System.out.println("0으로 만들 수 없습니다.");
//해당 경우에는 value가 사용되지 않음
}
}
}
public class ExceptionObj1 {
/**
* i를 k로 나눈 나머지를 반환한다.
* @param i
* @param k
* @return
* @throws ArithmeticException
*/
public int divide(int i, int k) throws ArithmeticException{
int value = 0;
value = i / k;
return value;
}
}
출력:
RuntimeException과 CheckedException
- RuntimeException: 실행시 오류가 나 에러가 발생하는 것
= RuntimeException라는 클래스를 상속받고있다.
- CheckedException: CheckedException RuntimeException라는 클래스를 상속받지 않는것
= Exception을 상속받고 있다.
[코드1]
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class Exception4 {
public static void main(String[] args) {
try{
FileInputStream fis = new FileInputStream("Exception4.java");
}catch(FileNotFoundException fnfe){
System.out.println("파일을 찾을수가 없어요.");
}
}
}
[코드2]
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class Exception4 {
public static void main(String[] args) throws FileNotFoundException {
FileInputStream fis = new FileInputStream("Exception4.java");
}
}
Exception만들때는 RuntimeException을 상속받는 클래스를 만드는 것이 좋음
3) 다중Exception 처리
public class Exception6 {
public static void main(String[] args) {
int[] array = {4,0};
int[] value = null;
try{
value[0] = array[0]/array[1];
}catch(ArrayIndexOutOfBoundsException aiob){
System.out.println(aiob.toString());
}catch(ArithmeticException ae){
System.out.println(ae.toString());
}catch(Exception ex){
System.out.println(ex);
}
}
}
→ java.lang.ArithmeticException: / by zero
public class Exception6 {
public static void main(String[] args) {
int[] array = {4,2};
int[] value = null;
try{
value[0] = array[0]/array[1];
}catch(ArrayIndexOutOfBoundsException aiob){
System.out.println(aiob.toString());
}catch(ArithmeticException ae){
System.out.println(ae.toString());
}catch(Exception ex){
System.out.println(ex);
}
}
}
→ java.lang.NullPointerException: Cannot store to int array because "value" is null
public class Exception6 {
public static void main(String[] args) {
int[] array = {4};
int[] value = new int[1];
try{
value[0] = array[0]/array[1];
}catch(ArrayIndexOutOfBoundsException aiob){
System.out.println(aiob.toString());
}catch(ArithmeticException ae){
System.out.println(ae.toString());
}catch(Exception ex){
System.out.println(ex);
}
}
}
→ java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 1
public class Exception6 {
public static void main(String[] args) {
int[] array = {4,2};
int[] value = new int[1]; //방1개자리 배열
try{
value[0] = array[0]/array[1];
}catch(ArrayIndexOutOfBoundsException aiob){
System.out.println(aiob.toString());
}catch(ArithmeticException ae){
System.out.println(ae.toString());
}catch(Exception ex){
System.out.println(ex);
}
}
}
→ 에러가 발생하지 않는다
4) 사용자 정의 Exception
public class MyException extends RuntimeException{
//오류 메세지나, 발생한 Exception을 감싼 결과로 내가 만든 Exception을 사용하고 싶을 때가 많다.
public MyException(String message) {
super(message);
}
public MyException(Throwable cause) {
super(cause);
}
}
public class Exception7 {
public static void main(String[] args) {
try{
ExceptionObj7 exobj = new ExceptionObj7();
int value = exobj.divide(10,0);
System.out.println(value);
}catch(MyException ex){
System.out.println("사용자 정의 Exception이 발생했네요.");
}
}
}
class ExceptionObj7{
public int divide(int i, int k) throws MyException{
int value = 0;
try{
value = i/k;
}catch(ArithmeticException ae){
throw new MyException("0으로 나눌 수 없습니다.");
}
return value;
}
}
'[즐거운 자바 강좌] 정리' 카테고리의 다른 글
[즐거운 자바] 섹션 5 - 배열 Arrays클래스 (0) | 2024.03.31 |
---|---|
[즐거운 자바 강좌] 섹션 5 - 배열(Array) (1) | 2024.03.31 |
[즐거운 자바 강좌] 섹션4 - 팩토리 메소드(Factory Method) 패턴 (0) | 2024.03.31 |
[즐거운 자바 강좌] 섹션4 - 인터페이스(interface) (3) | 2024.03.31 |
[즐거운 자바 강의] 섹션4 - 객체지향 문법 (3) (1) | 2024.03.31 |