- Today
- Total
- spring
- ์ธํด
- ๋ฐ์ดํฐ๋ฒ ์ด์ค
- ๋ฐฑ์๋
- array
- ๊ตฌํ
- ์๋ฃ๊ตฌ์กฐ
- PS
- leetcode
- java
- ์กธ์ ์ํ
- ํ๋ก๊ทธ๋๋จธ์ค
- CS
- Graph
- MST
- ๋ฐฑ์ค
- dp
- database
- ์์์ ๋ ฌ
- BFS
- Algorithm
- ์๋ฐ์์ ์
- ์๋ฐ
- ๊ทธ๋ฆฌ๋
- ๋ค์ต์คํธ๋ผ
- tree
- ๋ฒจ๋งํฌ๋
- OOP
- pytorch
- ๋ฌธ๋ฒ
Partially Committed
[CH08] ์์ธ์ฒ๋ฆฌ(Exception handling) ๋ณธ๋ฌธ
๋ณธ ํฌ์คํ ์ ์๋ฐ์ ์ ์ ๊ต์ฌ๋ฅผ ๊ณต๋ถํ๋ฉฐ, ๊ฐ๋จํ ์ ๋ฆฌ/๊ธฐ๋ก ์ฉ๋๋ก ์์ฑํ์์ต๋๋ค. ํน์ฌ, ์๋ชป๋ ๋ด์ฉ์ด ์๋ค๋ฉด ์ง์ ํด์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
1. ์์ธ์ฒ๋ฆฌ(exception handling)
- ์ปดํ์ผ ์๋ฌ๋ ์ปดํ์ผ ์ ๋ฐ์ํ๋ ์๋ฌ๋ฅผ ๋งํ๋ฉฐ, ๋ฐํ์ ์๋ฌ๋ ์คํ ์ ๋ฐ์ํ๋ ์๋ฌ์ด๊ณ ๋ ผ๋ฆฌ์ ์๋ฌ๋ ์คํ์ ์ ๋์ง๋ง ์๋์๋ ๋ค๋ฅด๊ฒ ๋์ํ๋ ๊ฒฝ์ฐ๋ฅผ ๋งํ๋ค.
- ์๋ฐ์์๋ runtime - error ๋ฅผ 2๊ฐ์ง(error, exception) ์ผ๋ก ๊ตฌ๋ถํ์๋ฐ.
- error ๋ ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ(OutOfMemoryError) ์ด๋ StackOverflowError ์ ๊ฐ์ ๋ณต๊ตฌํ ์ ์๋ ์ฌ๊ฐํ ์ค๋ฅ
- exception ์ ๋ฐ์๋๋๋ผ๋ ์์ต์ด ๊ฐ๋ฅํ ๋น๊ต์ ๋ฏธ์ฝํ ์ค๋ฅ
์๋ฐ์์๋ ์คํ ์ ๋ฐ์ํ ์ ์๋ ์ค๋ฅ๋ฅผ ํด๋์ค๋ก ์ ์ํ์๋ค. Object ํด๋์ค์ ์์์ธ Exception ๊ณผ Error ํด๋์ค์ ๊ด๋ จํ ๊ณ์ธต ๊ตฌ์กฐ๋ ์๋์ ๊ฐ๋ค.
RuntimeException ํด๋์ค๋ ํ๋ก๊ทธ๋๋จธ์ ์ฝ๋ ์ ์ค์๋ก๋ถํฐ ๋ฐ์ํ ์ ์๋ ์์ธ๋ค์ผ๋ก ArrayIndexOutOfBoundsException, NullPointerException, ClassCastException, ArithmeticException ์ ๊ฒฝ์ฐ์ ๋ฐ์ํ๋ค.
Exception ํด๋์ค๋ ์ธ๋ถ ์ํฅ์ผ๋ก๋ถํฐ ๋ฐ์ํ๋ ๊ฒ์ผ๋ก User ์ ๋์์ ์ํด ๋ฐ์ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. FileNotFoundException, ClassNotFoundException, DataFormatException ๋ฑ์ ํด๋นํ๋ค.
์์ธ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด try - catch ๋ฌธ์ ์ฌ์ฉํ ์ ์๋ค. ์์ธ ์ฒ๋ฆฌ(exception handling)๋ผ๋ ๊ฒ์ ์์ธ ๋ฐ์์ผ๋ก๋ถํฐ์ ๋น์ ์์ ์ธ ๋์์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ํํ๋ ๊ฒ์ด๋ค. ์์ธ๊ฐ ์ ์ฒ๋ฆฌ๋์ง ๋ชปํด์ ๋น์ ์์ ์ธ ๋์์ด ๋ฐ์ํ๋ฉด JVM ์ ์์ธ์ฒ๋ฆฌ๊ธฐ(UncaughtExceptionHandler)๊ฐ ๋ฐ์์ ์์ธ ์์ธ์ ํ๋ฉด์ ์ถ๋ ฅํด์ค๋ค.
class source{
public static void main(String[] args) {
int num = 100;
int result = 0;
for(int i = 0 ; i < 10; i ++){
try{
result = num/(int)(Math.random()*10);
System.out.println(result);
} catch (ArithmeticException e){
System.out.println("0");
}
}
}
}
์์ ์์ธ์ฒ๋ฆฌ ์์ ๊ฐ์ ๊ฒฝ์ฐ์๋ zero - dividing exception ์ ๋ํด์ ์ฒ๋ฆฌํ ๊ฒ์ด๋ค. try - catch ๊ตฌ๋ฌธ์ด ์คํ๋ ๋์ ํ๋ฆ์ ์ดํด๋ณด์. try ๋ธ๋ญ ๋ด์์ ์์ธ๊ฐ ๋ฐ์ํ๋ฉด ๋จผ์ ๋ฐ์ํ ์์ธ์ ์ผ์นํ๋ catch ๋ธ๋ญ์ ํ์ํ๊ณ , ๋ง์ฝ ํด๋นํ๋ ๋ธ๋ญ์ด ์๋ค๋ฉด ์ํํ ๋ค์ try - catch ๋ฌธ์ ๋น ์ ธ๋๊ฐ์ ๋ค์ ์ฝ๋๋ฅผ ์คํํ๋ค. ๋ง์ฝ ์ฐพ์ง ๋ชปํ๋ฉด ์์ธ ์ฒ๋ฆฌ๊ฐ ์๋๋ ๊ฒ์ด๋ค. try ๋ธ๋ญ ๋ด์์ ์์ ์์ธ๊ฐ ๋ฐ์ํ์ง ์์ ๊ฒฝ์ฐ์๋ ๊ทธ๋ฅ ๋ฐ๊นฅ์ผ๋ก ๋น ์ ธ๋๊ฐ๋ ๊ฒ์ด๋ค.
catch ๋ธ๋ญ์ ๋ง๋ฌ์ ๋, ์ฐจ๋ก๋๋ก catch ๋ธ๋ญ์ ( ) ๋ด์ ์ฐธ์กฐ๋ณ์์ ์ข ๋ฅ์ ์์ฑ๋ ์์ธ ํด๋์ค์ ์ธ์คํด์ค์ ๋ํ์ฌ instanceof ์ฐ์ฐ์๋ฅผ ์ด์ฉํด์ true ๋ฅผ ๋ฐํํ๋ ๋ธ๋ญ์ ๋ง๋ ๋ ๊น์ง ์ฐจ์ธฐ์ฐจ์ธฐ ๊ฒ์ฌํ๋ค. ๋ชจ๋ ์์ธ ํด๋์ค๋ Exception ํด๋์ค์ ์์์ด๊ธฐ ๋๋ฌธ์ catch ๋ธ๋ญ์ ( ) ๋ด์ Exception ํด๋์ค ํ์ ์ ์ฐธ์กฐ๋ณ์๋ฅผ ์ ์ธํ๋ฉด ์ด๋ค ์ข ๋ฅ์ ์์ธ๊ฐ ๋ฐ์ํ๋ค๊ณ ํ๋๋ผ๋ catch ๋ธ๋ญ์ ์ํด์ ์ฒ๋ฆฌ๊ฐ ๋๋ค.
class source{
public static void main(String[] args) {
int num = 100;
int result = 0;
for(int i = 0 ; i < 10; i ++){
try{
result = num/(int)(Math.random()*10);
result = 0/0;
System.out.println(result);
} catch (Exception e){
System.out.println("0");
}
}
}
}
์์ธ ๋ฐ์ ์ ์์ฑ๋๋ ์์ธ ํด๋์ค์ ์ธ์คํด์ค์๋ ์์ธ ์ ๋ณด๊ฐ ๋ด๊ฒจ์๋ค. ์ด๋ printStackTrace() : ์์ธ๋ฐ์ ์ ํธ์ถ ์คํ(Call Stack) ๋ด์ ์๋ ๋ฉ์๋ ์ ๋ณด ๋ฐ ์์ธ ๋ฉ์ธ์ง๋ฅผ ์ถ๋ ฅํ๋ค. ์ getMessage() : ๋ฐ์ํ ์์ธ ํด๋์ค์ ์ธ์คํด์ค์ ์ ์ฅ๋ ๋ฉ์ธ์ง๋ฅผ ์ป๋๋ค. ๋ฅผ ์ด์ฉํ๋ฉด ๋๋ค.
class source{
public static void main(String[] args) {
int num = 100;
int result = 0;
for(int i = 0 ; i < 10; i ++){
try{
result = num/(int)(Math.random()*10);
result = 0/0;
System.out.println(result);
} catch (Exception e){
e.printStackTrace();
System.out.println("error : " + e.getMessage());
}
}
}
}
JDK1.7 ๋ถํฐ | ๊ธฐํธ๋ฅผ ์ด์ฉํ์ฌ ํ๋์ catch ๋ธ๋ญ์ผ๋ก ์ฌ๋ฌ catch ๋ธ๋ญ์ ํํํ ์ ์๊ฒ ๋์๋๋ฐ, ์ด๋ฅผ multi - catch ๋ธ๋ญ ์ด๋ผ๊ณ ํ๋ค. ๋ค๋ง ์ฐ๊ฒฐ๋ ์์ธ ํด๋์ค๊ฐ ์๋ก ์กฐ์ - ์์ ๊ด๊ณ๋ผ๋ฉด ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค. ์ค์ํ ๊ฒ์ ํ๋์ catch ๋ธ๋ญ์ผ๋ก ์ฌ๋ฌ ์์ธ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์, ์ค์ ์ด๋ค ์์ธ๊ฐ ๋ฐ์ํ์ฌ ์ฒ๋ฆฌ๋ ๊ฒ์ธ์ง ์ ์ ์๋ค. ๊ทธ๋์ instanceof ์ฐ์ฐ์๋ฅผ ์ด์ฉํด์ ์ด๋ค ์์ธ๊ฐ ๋ฐ์ํ ๊ฒ์ธ์ง ์ฒดํฌํ ๋ค์ ๊ฐ๋ณ ์ฒ๋ฆฌ๋ฅผ ํ๋ ๊ฒ์ด ์ข์๋ฐ, ์ฌ์ค ์ด๋ ๊ฒ๊น์ง ํด์ catch ๋ธ๋ญ์ ํ๋๋ก ํฉ์น ์ด์ ๋ ํฌ๊ฒ ์๋ค.
throw ๋ฅผ ์ด์ฉํ์ฌ ์์ธ๋ฅผ ๋ฐ์์ํฌ ์๋ ์๋ค. ์์ธ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ๋ง๋ ๋ค์, throw ๋ฅผ ์ด์ฉํ์ฌ ๋ฐ์์ํค๋ฉด ๋๋ค.
class source{
public static void main(String[] args) {
try{
Exception e = new Exception("hi~~");
throw e;
} catch (Exception e){
System.out.println("error : " + e.getMessage());
e.printStackTrace();
}
}
}
๋ฉ์๋์ ์์ธ ์ ์ธํ๊ธฐ
try - catch ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ง ์๊ณ , ์์ธ๋ฅผ ๋ฉ์๋์ ์ ์ธํ ์๋ ์๋ค. ์ด๋ฅผ ์ํด์๋ ๋ฉ์๋์ ์ ์ธ๋ถ์ throws ํค์๋๋ฅผ ์ด์ฉํ์ฌ ๋ฐ์ ๊ฐ๋ฅํ ์์ธ ์ฌํญ์ ์ ์ด์ฃผ๋ฉด ๋๋ค. ์์ธ๊ฐ ์ฌ๋ฌ ๊ฐ์ด๋ฉด ์ผํ๋ก ๊ตฌ๋ถํ๋ค.
์ด์ ๊ฐ์ด ์๋ฐ์์๋ ๋ฉ์๋๋ฅผ ์์ฑํ ๋, ๋ฐ์ ๊ฐ๋ฅํ ์์ธ๋ฅผ ๋ฉ์๋ ์ ์ธ๋ถ์ ๋ช ์ํ๋๋ก ํ์ฌ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ด์ ๋ํ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๋๋ก ์๋ ค์ฃผ๋ ์ญํ ์ ํ๊ธฐ ๋๋ฌธ์ ํ๋ก๊ทธ๋จ์ ๋ณด๋ค ๊ฒฌ๊ณ ํ๊ฒ ์ค๊ณํ ์ ์๋ค.
import java.io.*;
class source{
public static void main(String[] args) {
File f = createFile(args[0]);
System.out.println(f.getName() + " is generated.");
}
static File createFile(String fileName){
try {
if (fileName==null || fileName.equals("") || fileName.equals("no"))
throw new Exception("Filename is invalid.");
} catch(Exception e){
fileName = "noname.txt";
} finally {
File f = new File(fileName);
createNewFile(f);
return f;
}
}
static void createNewFile(File f){
try{
f.createNewFile();
} catch(Exception e){ }
}
}
์์ ์ฝ๋๊ฐ์ ๊ฒฝ์ฐ์๋ ์์ธ๊ฐ ๋ฐ์ํ ๋ฉ์๋์์ ์ง์ ์์ธ๋ฅผ ์ฒ๋ฆฌํ๋ค. createFile ๋ฉ์๋์์๋ ์์ธ๊ฐ ๋ฐ์ํ ์ง ์๋์ง๋ฅผ ์์ ์๋๋ฐ, ์ ์ ์น ๋ชปํ ํ์ผ๋ค์์ด argument ๋ก ๋ค์ด์ค๋ฉด catch ๋ธ๋ญ์์ noname.txt ๋ผ๋ ์ด๋ฆ์ผ๋ก ํ์ผ์ ์์ฑํ๋ค. finally ๋ธ๋ญ์์๋ ์์ธ ๋ฐ์๊ณผ ๊ด๋ จ์์ด ํ์ผ์ ๋ฌด์กฐ๊ฑด ์์ฑํ๋ค.
intelliJ ์์ ๋ช ๋ น์ค ์ธ์ ์ค์ ํ๊ธฐ
ALT + Shift + F10 ์ ๋๋ฅธ ๋ค์, ์์ ์ค์ธ ํ๋ก์ ํธ ๋ช ์ ํ์ดํ๋ฅผ ๋๋ฅด๊ณ Edit ํด๋ฆญ ์ดํ Program argument ๋์ ๊ธฐ์ ํ๋ฉด ๋๋ค.
08.1.8 finally ๋ธ๋ญ
์์ธ์ ์๊ด์์ด ์คํ๋์ด์ผ ํ ์ฝ๋๋ฅผ ํฌํจ์ํฌ ๋ชฉ์ ์ผ๋ก finally ๋ธ๋ญ์ ์ฌ์ฉํ๋ค. ๋ณดํต try - catch - finally ์์๋ก ์ฝ๋๋ฅผ ์์ฑํ๋ค. ์์ธ๊ฐ ๋ฐ์ํ๋ฉด try - catch - finally ์์๋ก ์ฝ๋๊ฐ ์คํ๋๊ฒ ์ง๋ง, ์์ธ๊ฐ ๋ฐ์ํ์ง ์์ ๊ฒฝ์ฐ์๋ try - finally ์์๋ก ์คํ๋๋ค.
class source {
public static void main(String[] args) {
try {
startInstall();
copyFiles();
deleteTempFiles();
} catch (Exception e) {
e.printStackTrace();
deleteTempFiles();
}
}
static void startInstall() {
}
static void copyFiles() {
}
static void deleteTempFiles() {
}
}
์ ์ฝ๋๋ฅผ ๋ณด๋ฉด ์์ธ๊ฐ ๋ฐ์ํ๋๋ผ๋ ๋ฐ๋์ ์์ ํ์ผ๋ค์ด ์ญ์ ๋ ์ ์๋๋ก catch ๋ธ๋ญ์ deleteTempFiles() ๋ฉ์๋๊ฐ ๋ค์ด๊ฐ๋ค. ์ด์ ๊ฐ์ด ์์ธ ๋ฐ์์ ๊ด๊ณ์์ด deleteTempFiles() ๋ฉ์๋๋ ๋ฐ๋์ ์คํ๋์ด์ผ ํ๋ ๊ฒฝ์ฐ์ finally ๋ธ๋ญ์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ณด๋ค ์ข๋ค. ์๋์ ๊ฐ์ด ์์ฑํ๋๋ก ํ์.
class source {
public static void main(String[] args) {
try {
startInstall();
copyFiles();
} catch (Exception e) {
e.printStackTrace();
} finally {
deleteTempFiles();
}
}
static void startInstall() {
}
static void copyFiles() {
}
static void deleteTempFiles() {
}
}
์ ์ํด์ผํ ์ ์ try ๋ธ๋ญ์ ์คํ ๋์ค์ return ๋ฌธ์ด ์คํ๋๋๋ผ๋ finally ๋ธ๋ญ์ ๋ฌธ์ฅ์ด ์คํ๋ ๋ค์์ ํ์ฌ ์คํ ์ค์ธ ๋ฉ์๋๋ฅผ ์ข ๋ฃํ๋ค๋ ๊ฒ์ด๋ค. catch ๋ธ๋ญ ๋ฌธ์ฅ ์ํ ๋์ค์ return ๋ฌธ์ ๋ง๋๋๋ผ๋ ๋์ผํ๊ฒ finally ๋ธ๋ญ์ ๋ฌธ์ฅ๋ค์ด ์ํ๋๋ค.
08.1.9 ์๋ ์์ ๋ฐํ ( try - with - resources ๋ฌธ )
JDK1.7 ๋ถํฐ try - with - resources ๋ฌธ์ด ์ถ๊ฐ๋์๋ค. ์ด๋ I/O ํด๋์ค๋ฅผ ์ฌ์ฉํ ๋ ์ ์ฉํ์ง๋ง, ์ง๊ธ์ ๊ทธ๋ฅ ์์๋๊ธฐ๋ง ํ์... ์ ์ถ๋ ฅ ํด๋์ค ์ค์๋ ์์์ ๋ฐํํ๊ธฐ ์ํด ์ฌ์ฉ ์ดํ์ ๋ซ์์ค์ผํ๋ ๊ฒ๋ค์ด ์๋ค.
try{
fis = new FileInputStream("score.dat");
dis = new DataInputStream(fis);
} catch (IOException ie){
ie.printStackTrace();
} finally {
dis.close();
}
DataInputStream ์ ์ด์ฉํด์ ํ์ผ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ๋, ์์ ๊ฐ์ด ์์ธ๊ฐ ๋ฐ์ํ๋๋ผ๋ InputStream ์ด ๋ซํ๋๋ก finally ์์ close ๊ธฐ๋ฅ์ ์ํํ๋ ์ฝ๋๋ฅผ ๋ฃ์ด์ฃผ์๋ค. ํ์ง๋ง ์ค์ํ ๊ฒ์ close() ์์ฒด์์ ์์ธ๊ฐ ๋ฐ์ํ ์ ์๋ค๋ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์ ์ฝ๋๋ ์๋์ ๊ฐ์ด ์์ ํด์ผ ํ๋ค.
try{
fis = new FileInputStream("score.dat");
dis = new DataInputStream(fis);
} catch (IOException ie){
ie.printStackTrace();
} finally {
try{
if(dis!=null)
dis.close();
} catch(IOException ie){
ie.printStackTrace();
}
}
๋ค๋ง ์๋ฌด๋๋ finally ๋ธ๋ญ ์์ try - catch ๋ฌธ์ ์ถ๊ฐํ๊ธฐ ๋๋ฌธ์ ์ฝ๋์ ๊ฐ๋ ์ฑ์ด ๋ฎ์์ง ๊ฒ์ ์ฌ์ค์ด๋ค. ์ด๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด ์๋์ผ๋ก ์์์ ๋ฐํํ๋ try - with - resources ๋ฌธ์ด ์ถ๊ฐ๋์๋ค. try ๋ธ๋ญ์ ๊ดํธ ์์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋ฌธ์ฅ์ ๋ฃ์ผ๋ฉด try ๋ธ๋ญ์ ๋ฒ์ด๋๋ ์๊ฐ ์๋์ผ๋ก close() ๊ฐ ํธ์ถ๋์ด ๋ฆฌ์์ค๊ฐ ๋ฐ๋ฉ๋๋๋ก ๊ตฌํ๋๋ค. ์ด์ ๊ฐ์ด try - with - resources ๋ฌธ์ ์ํ์ฌ ๊ฐ์ฒด์ close() ๊ฐ ์๋์ผ๋ก ํธ์ถ๋ ์ ์๋๋ก ํ๋ ค๋ฉด ํด๋น ํด๋์ค๊ฐ AutoCloseable ์ด๋ผ๋ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ฒ์ด์ฌ์ผ๋ง ํ๋ค. ํ์ง๋ง close() ๋ํ Exception ์ ๋ฐ์์ํฌ ์ ์๋ค๋ ์ฌ์ค์ด ์ค์ํ๋ค.
class source{
public static void main(String[] args) {
try(CloseableResource cr = new CloseableResource()) {
cr.exceptionWork(false);
} catch(WorkException e){
e.printStackTrace();
} catch(CloseException e){
e.printStackTrace();
}
System.out.println();
try(CloseableResource cr = new CloseableResource()){
cr.exceptionWork(true); // ์์ธ ๋ฐ์
} catch(WorkException e){
e.printStackTrace();
} catch (CloseException e){
e.printStackTrace();
}
}
}
class CloseableResource implements AutoCloseable{
public void exceptionWork(boolean exception) throws WorkException{
System.out.println("call exceptionWork(" + exception + ")");
if(exception)
throw new WorkException("WorkException occurs!!");
}
public void close() throws CloseException{
System.out.println("call close()");
throw new CloseException("CloseException occurs!!");
}
}
class WorkException extends Exception{
WorkException(String msg) { super(msg);}
}
class CloseException extends Exception{
CloseException(String msg) {super(msg);}
}
์ฒซ ๋ฒ์งธ try - catch ๋ฌธ์์๋ close() ์์๋ง ์์ธ๋ฅผ ๋ฐ์์์ผฐ๋ค. ์ด์ ๋ฐ๋ฅธ ๋ฉ์ธ์ง๋ ์๋์ ๊ฐ๋ค.
CloseException: CloseException occurs!!
at CloseableResource.close(source.java:31)
at source.main(source.java:5)
๋ ๋ฒ์งธ try - catch ๋ฌธ์์๋ close() ์ exceptionWork() ์์ ๋ชจ๋ ์์ธ๋ฅผ ๋ฐ์์์ผฐ๋ค. ์ด์ ๋ฐ๋ฅธ ๋ฉ์ธ์ง๋ ์๋์ ๊ฐ๋ค.
WorkException: WorkException occurs!!
at CloseableResource.exceptionWork(source.java:27)
at source.main(source.java:13)
Suppressed: CloseException: CloseException occurs!!
at CloseableResource.close(source.java:31)
at source.main(source.java:12)
close() ์์ ๋ฐ์ํ ์์ธ๋ Suppressed ๋ผ๋ ๋จธ๋ฆฌ๋ง๊ณผ ์ถ๋ ฅ์ด ๋์๋๋ฐ, ๋ ์์ธ๋ ๋์์ ๋ฐ์ํ ์ ์์ผ๋ฏ๋ก ์ค์ ๋ก ๋ฐ์ํ ์์ธ๋ WorkException ์ผ๋ก ํ๊ณ , CloseException ์ suppresed ์์ธ๋ก ๋ค๋ฃฌ๋ค. suppressed ์์ธ์ ๋ํ ์ ๋ณด๋ WorkException ์ ์ ์ฅ๋๋ค. try - catch ๋ฌธ์ ์ฌ์ฉํ์๋๋ผ๋ฉด WorkException ์ ๋ฌด์๋๊ณ CloseException ์ ๋ํ ๋ด์ฉ๋ง ์ถ๋ ฅ๋์์ ๊ฒ์ด๋ค. ( ๋์ค์ ๋ค์ ๋์์์ ์๊ฐํด๋ณด์... )
[1.10 ์ฌ์ฉ์์ ์ ์์ธ ๋ง๋ค๊ธฐ]
๊ธฐ์กด์ ์ ์๋ ์์ธ ํด๋์ค๊ฐ ์๋ ์๋ก์ด ์์ธ ํด๋์ค๋ฅผ ์ ์ํ์ฌ ์ฌ์ฉํ ๋์๋ ๋ณดํต Exception ํด๋์ค๋ RuntimeException ํด๋์ค๋ฅผ ์์๋ฐ์์ ๋ง๋ ๋ค. ์ผ๋ฐ์ ์ผ๋ก Exception ํด๋์ค๋ฅผ ์์๋ฐ์ checked exception ์ผ๋ก ๋ง๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์์ง๋ง ์์ฆ์๋ RuntimeException ์ ์์๋ฐ์ ์์ธ์ฒ๋ฆฌ๋ฅผ ์ ํ์ ์ผ๋ก ํ ์ ์๋๋ก ๋ง๋ ๋ค๊ณ ํ๋ค. checked exception ์ ๋ฐ๋์ ๋ณ๋์ ์์ธ์ฒ๋ฆฌ๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์, ๋ง์ฝ ์์ธ์ฒ๋ฆฌ๊ฐ ํ์์น ์์ ๊ฒฝ์ฐ์๋ try-catch ๋ฅผ ๋ฃ์ด์ฃผ์ด์ผ ํ๋ฏ๋ก ์ฝ๋๊ฐ ๋ณต์กํด์ง๋ค. ์ด๊ธฐ์ checked exception ์ผ๋ก ์ฃผ๋ก ๋ง๋ค์์ง๋ง ๊ทผ๋์ ์ข ์ข unchecked exception ์ผ๋ก ๋ง๋๋ ์ด์ ๋ ์ฃผ๋ก ๋ชจ๋ฐ์ผ์ด๋ ์น ํ๋ก๊ทธ๋๋ฐ์์ ์๋ฐ๊ฐ ์ฐ์ด๊ธฐ ๋๋ฌธ์ ํ์์ ๋ฐ๋ผ์ ์์ธ์ฒ๋ฆฌ ์ฌ๋ถ๋ฅผ ์ ํํ ์ ์๋๋ก ํ๊ธฐ ์ํจ์ด๋ค.
class source{
public static void main(String[] args) {
try{
startInstall();
copyFile();
} catch (SpaceException e) {
System.out.println("error msg : " + e.getMessage());
e.printStackTrace();
System.out.println("you have to obtain more install spaces.");
} catch(MemoryException me){
System.out.println("error msg : " + me.getMessage());
me.printStackTrace();
System.gc(); // Garbage Collection ์ ์ํํด์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋๋ ค์ฃผ๋ ๊ฒ.
System.out.println("try again!");
} finally {
deleteTempFiles();
}
}
static void startInstall() throws SpaceException, MemoryException{
if(!enoughSpace())
throw new SpaceException("not enough install spaces.");
if(!enoughMemory())
throw new MemoryException("not enough memory spaces.");
}
static void copyFile() {}
static void deleteTempFiles(){}
static boolean enoughSpace(){
//
return false;
}
static boolean enoughMemory(){
//
return true;
}
}
class SpaceException extends Exception {
SpaceException(String msg){
super(msg);
}
}
class MemoryException extends Exception{
MemoryException(String msg){
super(msg);
}
}
[1.11 ์์ธ ๋๋์ง๊ธฐ; exception re-throwing]
ํ ๋ฉ์๋์์ ๋ฐ์ํ ์ ์๋ ์์ธ๊ฐ ์ฌ๋ฟ์ธ ๊ฒฝ์ฐ์, ์ผ๋ถ๋ try-catch ๋ฌธ์ ์ด์ฉํด์ ๋ฉ์๋ ๋ด์์ ์ฒ๋ฆฌํ๊ณ ๋๋จธ์ง๋ ์ ์ธ๋ถ์์ ์ง์ ํด์ ํธ์ถํ ๋ฉ์๋์์ ์ฒ๋ฆฌํ๋๋ก ํ๋ค. ์ด๋ ์์ธ๋ฅผ ์ฒ๋ฆฌํ ๋ค์ ์ธ์์ ์ผ๋ก ์์ธ๋ฅผ ๋ค์ ๋ฐ์์ํค๋ exception re-throwing ์ ์ด์ฉํด์ ๊ฐ๋ฅํ๋ค. ์์ธ๊ฐ ๋ฐ์ํ ๋ฉ์๋์ ํธ์ถํ ๋ฉ์๋ ์์ชฝ์์ ๋ชจ๋ ์ฒ๋ฆฌํด์ผํ ๋ ์์ธ ๋๋์ง๊ธฐ๋ฅผ ์ฌ์ฉํ๋ค. ๋ค๋ง ์์ธ๊ฐ ๋ฐ์ํ ๋ฉ์๋์์๋ try - catch ๋ฌธ์ ์ด์ฉํด์ ์์ธ ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ๋ ๊ฒ๊ณผ ๋์์ ๋ฉ์๋ ์ ์ธ๋ถ์ ๋ฐ์ํ ์์ธ๋ฅผ throws ์ ์ง์ ํด์ฃผ์ด์ผ ํ๋ค.
class source{
public static void main(String[] args) {
try{
method1();
} catch(Exception e){
System.out.println("Exception is handled at main method.");
}
}
static void method1() throws Exception {
try{
throw new Exception();
} catch (Exception e) {
System.out.println("Exception is handled at method1.");
throw e; // re - throwing
}
}
}
๋ฐํ๊ฐ์ด ์๋ return ๋ฌธ์ ๊ฒฝ์ฐ์๋ catch ๋ธ๋ญ์๋ return ๋ฌธ์ด ์์ด์ผ ํ์ง๋ง, catch ๋ธ๋ญ์์ exception re-throwing ์ ํ์ฌ ํธ์ถํ ๋ฉ์๋๋ก exception ์ ์ ๋ฌํ๋ ๊ฒฝ์ฐ์๋ return ๋ฌธ์ด ์์ด๋ ๋๋ค.
References
http://www.yes24.com/Product/Goods/24259565
'๐ป Study ! > JAVA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[CH11] Collections framework (2) | 2022.08.27 |
---|---|
[CH09] java.lang ํจํค์ง (0) | 2022.08.21 |
[CH07] ๊ฐ์ฒด์งํฅํ๋ก๊ทธ๋๋ฐ4 (OOP) (0) | 2022.08.02 |
[CH07] ๊ฐ์ฒด์งํฅํ๋ก๊ทธ๋๋ฐ3 (OOP) (0) | 2022.08.01 |
[CH07] ๊ฐ์ฒด์งํฅํ๋ก๊ทธ๋๋ฐ2 (OOP) (0) | 2022.07.31 |