자바 프로그래밍에서finally 문장의 기본 사용 방법을 설명하다
public class TryAndFinallyTest {
public static void main(String[] args) throws Exception{
try{
int a = testFinally(2);
System.out.println(" a:"+a);
}catch(Exception e){
int b = testFinally(1);
System.out.println(" b:"+b);
}
int b = testFinally(3);
System.out.println("break :"+b);
b = testFinally(4);
System.out.println("return :"+b);
}
static int testFinally(int i) throws Exception{
int flag = i;
try{// try ,finally
switch(i){
case 1:++i;break;//
case 2:throw new Exception(" ");
case 3:break;
default :return -1;
}
}finally{
System.out.println("finally coming when i="+flag);
}
return i;
}
}
실행 결과는 다음과 같습니다.
finally coming when i=2
finally coming when i=1
b:2
finally coming when i=3
break :3
finally coming when i=4
return :-1
결과는 상술한 어떤 상황이든finally 블록이 실행될 수 있음을 설명한다. 다른 언어의 모델에 비해finally 키워드는 자바 이상 처리 모델에 대한 가장 좋은 보충이다.finally 구조는 이상이 있든 없든 코드를 실행합니다.finally를 사용하면 대상의 내부 상태를 유지하고 비메모리 자원을 정리할 수 있습니다.만약 Finally가 없다면, 당신의 코드는 매우 이해하기 어려울 것입니다.예를 들어 다음 코드는 finally를 사용하지 않는 상황에서 비메모리 자원을 방출하기 위해 코드를 어떻게 작성해야 하는지 설명합니다.
import java.net.*;
import java.io.*;
class WithoutFinally
{
public void foo() throws IOException
{
//
ServerSocket ss = new ServerSocket(0);
try
{
Socket socket = ss.accept();
// ...
}
catch (IOException e)
{
ss.close(); //1
throw e;
}
//...
ss.close(); //2
}
}
이 코드는 플러그인을 만들고 accept 방법을 호출합니다.이 방법을 종료하기 전에, 자원의 빈틈을 피하기 위해서 이 플러그인을 닫아야 합니다.이 임무를 완성하기 위해서, 우리는//2에서 close를 호출합니다. 이것은 이 방법의 마지막 문장입니다.그러나try 블록에 이상이 발생하면 어떻게 될까요?이런 상황에서//2곳의close 호출은 영원히 발생하지 않습니다.따라서, 이 이상을 포착하고, 이 이상을 다시 보내기 전에//1에close에 대한 다른 호출을 삽입해야 합니다.이렇게 하면 이 방법을 종료하기 전에 플러그인을 닫을 수 있다.이렇게 코드를 작성하는 것은 번거롭고 오류가 발생하기 쉽지만,finally가 없는 상황에서는 반드시 없어서는 안 된다.불행하게도finally 메커니즘이 없는 언어에서 프로그래머는 이런 방식으로 그들의 코드를 조직하는 것을 잊어버려서 자원의 빈틈을 초래할 수 있다.자바의finally 자구가 이 문제를 해결했다.finally가 있으면 앞의 코드는 다음과 같은 형식으로 다시 쓸 수 있습니다.
import java.net.*;
import java.io.*;
class WithFinally
{
public void foo2() throws IOException
{
//
ServerSocket ss = new ServerSocket(0);
try
{
Socket socket = ss.accept();
// ...
}
finally
{
ss.close();
}
}
}
finally 블록은close 방법이 항상 실행되는지 확인하고try 블록에서 이상이 발생하든지 말든지.따라서 이 방법을 종료하기 전에close 방법을 사용할 수 있습니다.이렇게 하면 플러그인이 닫히고 자원이 누설되지 않았다는 것을 확신할 수 있습니다.이 방법에서catch 블록이 더 이상 필요하지 않습니다.첫 번째 예시에서catch 블록을 제공하는 것은 플러그인을 닫기 위해서입니다. 현재는finally를 통해 닫습니다.만약 캐치 블록을 제공했다면,finally 블록의 코드는catch 블록이 완성된 후에 실행됩니다.finally 블록은try 또는try/catch 블록과 함께 사용해야 합니다.또한,try 블록을 종료하고finally 블록을 실행하지 않을 수 없습니다.만약finally 블록이 존재한다면, 그것은 항상 실행될 것이다.(그런 점에서 볼 때, 이 진술은 모두 정확합니다.try 블록을 실행하지 않고finally 블록을 종료할 수 있는 방법이 있습니다. 코드가try 내부에서 System.exit(0)를 실행하면.문장, 프로그램이 종료되고finally 실행이 실행되지 않습니다.다른 한편, try 블록이 실행되는 동안 전원을 끄면finally도 실행되지 않습니다.)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.