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:
importjava.util.*;importjava.io.*;publicclassTeste{publicstaticvoidmain(Stringargs[]){FileReaderarquivo;try{arquivo=newFileReader("teste.txt");}catch(FileNotFoundExceptione){System.out.println("Ärquivo não encontrado");}arquivo.close();}}
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.
2) 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?
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
V
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?
Silver_FOX
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?
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
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;
Silver_FOX
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;
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:
importjava.io.*;importjava.util.*;publicclassArquivo{publicvoidmetodoTeste(Stringnome){FileReaderarquivo;Scannerteste;try{arquivo=newFileReader("teste.txt");}catch(SecurityExceptione){System.out.println("Arquivo não encontrado ou sem permissão");}catch(FileNotFoundExceptione){System.out.println("Arquivo não encontrado");}teste=newScanner(arquivo);// <---- ERRO de Inicialização.System.out.println(teste.nextLine());}}
J
jukkinha
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
claudneto
Silver FOX:
importjava.io.*;importjava.util.*;publicclassArquivo{publicvoidmetodoTeste(Stringnome){FileReaderarquivo;Scannerteste;try{arquivo=newFileReader("teste.txt");}catch(SecurityExceptione){System.out.println("Arquivo não encontrado ou sem permissão");}catch(FileNotFoundExceptione){System.out.println("Arquivo não encontrado");}teste=newScanner(arquivo);// <---- ERRO de Inicialização.System.out.println(teste.nextLine());}}
A classe Scanner é sempre usada com System.in...
Scannerinput=newScanner(System.in);
Isso quer dizer que ela vai receber dados do teclado...
Silver_FOX
claudneto:
A classe Scanner é sempre usada com System.in...
Isso quer dizer que ela vai receber dados do teclado...
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:
importjava.io.*;importjava.util.*;publicclassArquivo{FileReaderarquivo;Scannerteste;publicvoidmetodoTeste(Stringnome){try{arquivo=newFileReader("teste.txt");}catch(SecurityExceptione){System.out.println("Arquivo não encontrado ou sem permissão");}catch(FileNotFoundExceptione){System.out.println("Arquivo não encontrado");}teste=newScanner(arquivo);// <---- ERRO de Inicialização.System.out.println(teste.nextLine());}}
E isso da erros:
importjava.io.*;importjava.util.*;publicclassArquivo{publicvoidmetodoTeste(Stringnome){FileReaderarquivo;Scannerteste;try{arquivo=newFileReader("teste.txt");}catch(SecurityExceptione){System.out.println("Arquivo não encontrado ou sem permissão");}catch(FileNotFoundExceptione){System.out.println("Arquivo não encontrado");}teste=newScanner(arquivo);// <---- ERRO de Inicialização.System.out.println(teste.nextLine());}}
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.
claudneto
Silver FOX:
claudneto:
A classe Scanner é sempre usada com System.in…
Isso quer dizer que ela vai receber dados do teclado…
Uai, Scanner não pode ser utilizada com qualquer classe que implemente a interface Readable (como System.in)?
Realmente…me desculpe…errei…
J
jukkinha
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
renatocustodio
FileReaderarquivo=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.
B
Bruno_Laturner
Java obriga toda e qualquer variável local ser iniciada com um valor, não é só um problema do escopo do try-catch-finally.
Silver_FOX
Saquei, é isso mesmo. De fato, a exceção pode ser lançada antes da inicialização. Colocando o Null la em cima funfa.