자바 프로그래밍에서finally 문장의 기본 사용 방법을 설명하다

3719 단어 Javafinally
자바에서finally 관건은 일반적으로try와 함께 사용됩니다. 프로그램이 try 블록에 들어간 후에 프로그램이 이상으로 인해 중단되거나 다른 방식으로 종료된 것을 되돌려주든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도 실행되지 않습니다.)

좋은 웹페이지 즐겨찾기