Duvida sobre escopo de Try Catch

Pessoal,

Embora ja programe algum tempo em outras linguagens estou iniciando no Java. Estou estudando por conta… via Deitel e livros e estou com uma pequena duvida no código abaixo por ex:

[code]

import java.util.;
import java.io.
;

public class Teste {

public static void main(String args[]) {
	
	FileReader arquivo;

	try {    
		arquivo = new FileReader("teste.txt");
	}
	
	catch(FileNotFoundException e) {
		System.out.println("Ärquivo não encontrado");
	}
	
	arquivo.close();
	
}

}[/code]

O código apenas abre e fecha um arquivo. Mas sou obrigado a dar um cacth na exceção. O detalhe é que esta código da um erro na linha "arquivo.close()"dizendo que a variável não foi inicializada.

  1. A pergunta: A referencia criada dentro do try não segue no código?

Se eu tivesse criado o FileReader arquivo dentro do try até faria sentido pois ela se perderia num escopo local. Mas eu a criei antes e mesmo assim não consegui usá-la.

  1. Se eu criar a variável fora do escopo do método main não poderei usá-la pois, sendo o main static, ele não pode acessar variáveis não estatic certo?

Tks pela ajuda,

para estes casos existe a clausula finally.

Sorry, nao entendi. O bloco finally executa independentemente de alguma exceção ter sido atirada ou não. Mas onde ela ajudaria nesse caso?

Pelo que andei testando, esse erro acontece somente quando o try esta dentro de um método static. Ou seja, num método static as referencias criadas dentro de um bloco try não são carregadas mesmo se as variáveis tiverem sido criadas fora do try (mas ainda dentro do método static).

Só Não entendo por que disso.

[]’ s

É o seguinte, nesse caso você poderia fechar o arquivo dentro do bloco Try. Porque caso seja lançada a exceção o arquivo não será inicializado, por isso você não pode fazer referência a ele na sequencia do código, pois não há garantia que o arquivo existe. Nesse teu exemplo o finaly realmente não se aplica.
Blz?

[quote=valterj]É o seguinte, nesse caso você poderia fechar o arquivo dentro do bloco Try. Porque caso seja lançada a exceção o arquivo não será inicializado, por isso você não pode fazer referência a ele na sequencia do código, pois não há garantia que o arquivo existe. Nesse teu exemplo o finaly realmente não se aplica.
Blz?[/quote]

Não não…rs essa parte eu entendi. O método close() que eu usei foi só por exemplo.

Suponhamos que eu dentro do try criei a referencia para o arquivo teste.txt ok?

Se eu quiser usar esse arquivo fora do try não consigo. Mesmo que o objeto tenha sido criado antes do try. E o que mais me deixa perplexo é: Por que eu não posso usar ele fora do try só em métodos static! rs

[] 's

1º. Sim a referencia segue o codigo, ela apenas não é visivel fora do bloco try catch, por isso o erro diz q a variavel não foi inicializada;

2º Caso sua variavel seja global vc acessaria ela tanto dentro do metodo main quanto em qualquer outro metodo de sua classe;

[quote=thiagocg]1º. Sim a referencia segue o codigo, ela apenas não é visivel fora do bloco try catch, por isso o erro diz q a variavel não foi inicializada;

2º Caso sua variavel seja global vc acessaria ela tanto dentro do metodo main quanto em qualquer outro metodo de sua classe;[/quote]

Então é exatamente essa a minha duvida.

A variável é criada antes do try (portanto existe independente de rolar exceções);
A referencia com new é criada dentro do try mas essa variável não pode ser usada. Vou dar um outro exemplo:

[code]import java.io.;
import java.util.
;

public class Arquivo {

public void metodoTeste (String nome) {
	FileReader arquivo;
	Scanner teste;
	
	try {						
		arquivo = new FileReader ("teste.txt");
	}

	catch (SecurityException e) {
		System.out.println("Arquivo não encontrado ou sem permissão");
	}
	
	catch (FileNotFoundException e) {
		System.out.println("Arquivo não encontrado");
		
	}
	
	teste = new Scanner(arquivo);  // <---- ERRO de Inicialização.
	System.out.println(teste.nextLine());
	
}

}[/code]

o problema é que não é garantido que o que está dentro do bloco try foi executado (no caso de alguma exceção ter sido capturada) …
por isso a variável pode não estar inicializada

[quote=Silver FOX]

[code]import java.io.;
import java.util.
;

public class Arquivo {

public void metodoTeste (String nome) {
	FileReader arquivo;
	Scanner teste;
	
	try {						
		arquivo = new FileReader ("teste.txt");
	}

	catch (SecurityException e) {
		System.out.println("Arquivo não encontrado ou sem permissão");
	}
	
	catch (FileNotFoundException e) {
		System.out.println("Arquivo não encontrado");
		
	}
	
	teste = new Scanner(arquivo);  // <---- ERRO de Inicialização.
	System.out.println(teste.nextLine());
	
}

}[/code][/quote]

A classe Scanner é sempre usada com System.in…

Scanner input = new Scanner(System.in);

Isso quer dizer que ela vai receber dados do teclado…

[quote=claudneto]

A classe Scanner é sempre usada com System.in…

Isso quer dizer que ela vai receber dados do teclado…[/quote]

Uai, Scanner não pode ser utilizada com qualquer classe que implemente a interface Readable (como System.in)?

Anyway, eu entendo que no momento do try a exceção pode ter sido lançada antes de a variável ter sido inicializada. Então por que:

Isso Compila de boa:


import java.io.*;
import java.util.*;

public class Arquivo {
	FileReader arquivo;
	Scanner teste;
	
	public void metodoTeste (String nome) {

		
		try {						
			arquivo = new FileReader ("teste.txt");
		}

		catch (SecurityException e) {
			System.out.println("Arquivo não encontrado ou sem permissão");
		}
		
		catch (FileNotFoundException e) {
			System.out.println("Arquivo não encontrado");
			
		}
		
		teste = new Scanner(arquivo);  // <---- ERRO de Inicialização.
		System.out.println(teste.nextLine());
		
	}
	
}

E isso da erros:

[code]import java.io.;
import java.util.
;

public class Arquivo {

public void metodoTeste (String nome) {

FileReader arquivo;
Scanner teste;
	
	try {						
		arquivo = new FileReader ("teste.txt");
	}

	catch (SecurityException e) {
		System.out.println("Arquivo não encontrado ou sem permissão");
	}
	
	catch (FileNotFoundException e) {
		System.out.println("Arquivo não encontrado");
		
	}
	
	teste = new Scanner(arquivo);  // <---- ERRO de Inicialização.
	System.out.println(teste.nextLine());
	
}

}[/code]

Eu apenas alterei o local de declaração das variáveis. Em uma elas são no método. Outras, variáveis de classe. Mas ambas, no ponto de chamada estão dentro de Escopo.

[quote=Silver FOX][quote=claudneto]

A classe Scanner é sempre usada com System.in…

Isso quer dizer que ela vai receber dados do teclado…[/quote]

Uai, Scanner não pode ser utilizada com qualquer classe que implemente a interface Readable (como System.in)?
[/quote]

Realmente…me desculpe…errei…

as variáveis de instância são inicializadas automaticamente com um valor padrão (null para os objetos)…
as variáveis locais precisam ser inicializadas explicitamente

FileReader arquivo = null;  

Se colocasse isso iria compilar no primeiro. Como foi explicado, a variável pode não ter sido inicializada, pois ocorreu um erro. Se vc colocar null nela dentro do próprio catch tbm não vai dar erro, pois se ela não inciar do jeito certo no try, vai inicializar com null no catch, saca? É mais ou menos isso que ocorre quando declara ela global lá em cima.

Java obriga toda e qualquer variável local ser iniciada com um valor, não é só um problema do escopo do try-catch-finally.

Saquei, é isso mesmo. De fato, a exceção pode ser lançada antes da inicialização. Colocando o Null la em cima funfa.

[]'s e obrigado,