Pergunta

Em C++, nós aquisição de um recurso em um construtor e liberá-lo em um processo de destruição.

Assim, quando uma exceção sobe em uma média de uma função não haverá fuga de recursos ou bloqueado mutexes ou o que seja.

AFAIK classes java não tem destruidores.Então, como se faz o gerenciamento de recursos em Java.

Por exemplo:

public int foo() {    
    Resource f = new Resource();
    DoSomething(f);
    f.Release();
}

Como pode uma liberação de recursos se DoSomething lança uma exceção?Não podemos colocar tenta\blocos catch todo o código, podemos?

Foi útil?

Solução

Sim, você pode e deve colocar try/catch/finally bloco em torno de seu código.Em C# não há um atalho para a "utilizar" a instrução, mas em Java você está preso com:

public int foo() {
    Resource f = new Resource();
    try {
        DoSomething(f);
    }
    finally {
        f.Release();
    }
}

Outras dicas

Essa questão remonta a 2008 e, portanto, refere-se para o Java 6.Desde então, o Java 7 foi lançado, que contém um novo recurso do sistema Automático de Gestão de Recursos.Para uma mais recente, questão que é relevante para o Java 7 ver esta pergunta:

java técnicas para a automática liberação de recursos?"prompt de limpeza"?

É possível fator try/finally (e de exceção e algoritmos) utilizando a Executar em torno de expressão.No entanto, a sintaxe é altamente detalhado.

public int foo() {
    withResource(new WithResource() { public void run(Resource resource) {
        doSomething(resource);
    }});
}

...

public interface WithResource {
    void run(Resource resource);
}

public static void withResource(WithResource handler) {
    Resource resource = new Resource();
    try {
        handler.run(resource);
    } finally {
        resource.release();
    }
}

Esse tipo de coisa faz mais sentido se você está aprendendo mais do que o try/finally.Por exemplo, com o JDBC, você pode executar uma instrução de loop através de resultados, feche os recursos e enrole a exceção.

Se você quiser o usar o bloco de envolver-se em java encerramento do debate :S

Desculpe decepcioná-lo, mas em Java que nós fazer tente usar\catch\, finalmente, blocos de um monte.E com "muito", eu quero dizer UM MONTE.Eu às vezes desejo que o Java tem a C# usando o bloco.Na maioria das vezes você não precisa liberar recursos do Java coletor de lixo irá cuidar disso.

No entanto excepções têm seu uso na tomada de tratamento de erro muito mais limpo.Você pode escrever sua própria exceções e pegá-los para o que você está fazendo.Não mais retornando arbitrária de códigos de erro para o usuário!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top