해결된 질문
작성
·
275
0
처음에 MyFileWriter 클래스를 null 로 선언하고 Try 문안에서 new 키워드를 사용한 이유는 무엇인지 궁금합니다 !!
public static void main(String[] args){
MyFileWriter writer = new MyFileWriter();
try{
writer.write("아이스크림이 먹고 싶어요");
}catch (Exception e){
e.printStackTrace();
}finally {
try {
writer.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
이런식으로 사용하는 것과 무슨 차이가 있는지 궁금합니다 !
답변 3
0
안녕하세요?
네, 맞습니다. try 문 밖에서 null 로 선언해두고 try 문 안에서 초기화하는 것과 try 문 안에서 초기화하는 것은 동작 및 예외 처리에 있어서는 동일합니다. 다만 writer 객체를 try 문 안에서 선언하게 되면 finally 에서 writer 를 사용할 수가 없어요. 모든 변수는 변수가 선언된 곳 내에서만 사용될 수 있는데 try { ... } 영역과 finally { ... } 영역은 서로 다르기 때문에 try { 내부 } 에서 선언된 변수는 finally { 내부 } 에서는 사용될 수가 없습니다.
try {
MyFileWriter writer = new MyFileWriter();
writer.write("아이스크림이 먹고 싶어요");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
writer.close(); // 에러 발생
} catch (Exception e) {
throw new RuntimeException(e);
}
}
그래서 이러한 예제와 비슷한 경우에는 try { } 와 finally { } 모든 곳에서 사용할 수 있도록 try { } 밖에서 변수를 선언하는 것을 권해드립니다.
감사합니다 😊
0
안녕하세요?
객체를 try 블럭 내에서 초기화하는 것은 경우에 따라 유용할 수 있습니다. 특히 객체를 초기화하는 과정에서 발생할 수 있는 예외를 처리할 수 있게 해주는데요. 예를 들어 어떤 객체를 초기화할 때 파일을 열어야 하는데 지정된 경로에 파일이 없다면 예외가 발생할 수 있겠지요. 또는 어떤 내용을 쓰기 위해 파일을 여는데 그 파일이 읽기 전용인 경우에도 문제가 될 수 있습니다. 이때 초기화하는 과정을 try 블럭 내에 넣는다면, 프로그램이 비정상 종료되는 대신 catch 블럭에서 적절한 예외 처리를 할 수 있을 거에요 😊
감사합니다.
그러면 try 문 밖에서 null 로 선언하고 try 문 안에서 초기화해주는것과
try 문안에서 바로 객체를 초기화해주는것은 똑같은거네요 ?
public static void main(String[] args){
try{
MyFileWriter writer = new MyFileWriter();
writer.write("아이스크림이 먹고 싶어요");
}catch (Exception e){
e.printStackTrace();
}finally {
try {
writer.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
0
안녕하세요 최재영님, 인프런 AI 인턴이에요.
MyFileWriter 클래스를 null로 선언하고 Try 문 안에서 new 키워드를 사용한 이유는, 예외 발생 시에는 try-catch 블록에서 예외를 처리하고 finally 블록에서 객체를 닫기 위해서입니다.
만약 처음에 MyFileWriter writer = new MyFileWriter()로 객체를 생성하면, 객체 생성 이전에 예외가 발생할 경우에는 writer 변수가 null인 상태로 finally 블록으로 접근하게 되며, null 상태로 close() 메서드를 호출하면 NullPointerException이 발생할 수 있습니다.
따라서, 예외가 발생할 수 있는 코드에서는 객체를 null로 미리 선언하고 try 블록에서 new 키워드를 사용하여 객체를 생성하는 것이 안전한 방법입니다. 이렇게 하면 언제나 finally 블록에서 객체를 닫을 수 있습니다.
감사합니다!
이해했습니다 ! 답변 감사합니다