Usando FileReader causa um erro de compilador “tipo de exceção não tratada FileNotFoundException”

Eu li alguns tópicos aqui que relacionam o mesmo problema, mas as soluções não estão funcionando. : /

Eu uso o Eclipse, aqui está o meu programa.

package mypackage; import java.io.*; public class myclass { public static void main(String[] args) { //String myfile = "/home/jason/workspace/myproject/src/mypackage/myscript.abc"; String myfile = "src/mypackage/myscript.abc"; File file1 = new File(myfile); if(file1.exists()) { log(myfile + " exists. length : " + myfile.length()); } else{ log(myfile + " does not exist"); //System.exit(1); } //FileReader fr = new FileReader("myscript.abc");//I uncomment this and die inside System.out.println("\nAbsPath : " + new File(".").getAbsolutePath()); System.out.println("\nuser.dir : " + System.getProperty("user.dir")); } public static void log(String s){ System.out.println(s); } 

}

O erro que recebo, não importa o que eu tente, ou onde eu coloquei myscript.abc (é salpicado em todo o diretório de projetos agora) é este:

Tipo de exceção não tratada FileNotFoundException myclass.java / myproject / src / mypackage

Raciocínio final, puxando os cabelos.

Tipo de exceção não tratada FileNotFoundException myclass.java / myproject / src / mypackage

Este é um erro do compilador. O Eclipse está lhe dizendo que o seu programa não compila o código de byte java (então é claro que você não pode executá-lo). Por enquanto, você pode consertá-lo simplesmente declarando que seu programa pode lançar essa exceção. Igual a:

 public static void main(String[] args) throws FileNotFoundException { 

Para referência futura, observe que o sublinhado ondulado vermelho no Eclipse significa que há um erro do compilador. Se você passar o mouse sobre o problema, o Eclipse geralmente sugerirá algumas soluções muito boas. Nesse caso, uma sugestão seria “adicionar uma cláusula throws ao main”.

Use o descritor de arquivo que você criou e verificou antes de criar o leitor de arquivos. Além disso, você provavelmente terá problemas ao usar caminhos relativos. Por que a linha com o caminho completo foi comentada? Em todo caso, aqui está o código:

 if(file1.exists()) { log(myfile + " exists. length : " + myfile.length()); FileReader fr = new FileReader(file1); } 

Vejo que você tentou especificar o caminho completo para o seu arquivo, mas falhou devido ao seguinte erro :

você não declarou ou tentou capturar java.io.FileNotFoundException .

Para consertá-lo, você pode replace a linha

 FileReader fr = new FileReader("myscript.abc"); 

com o código:

 try { FileReader fr = new FileReader("/home/jason/workspace/myproject/src/mypackage/myscript.abc"); } catch (FileNotFoundException ex) { Logger.getLogger(myclass.class.getName()).log(Level.SEVERE, null, ex); } 

O código a seguir é compilado com sucesso e deve funcionar:

 package mypackage; import java.io.*; // It's better to use Camel style name for class name, for example: MyClass. // In such a way it'll be easier to distinguish class name from variable name. // This is common practice in Java. public class myclass { public static void main(String[] args) { String myfile = "/home/jason/workspace/myproject/src/mypackage/myscript.abc"; File file1 = new File(myfile); if (file1.exists()) { log("File " + myfile + " exists. length : " + myfile.length()); } else { log("File " + myfile + " does not exist!"); } try { FileReader fr = new FileReader(myfile); } catch (FileNotFoundException ex) { // Do something with mistake or ignore ex.printStackTrace(); } log("\nAbsPath : " + new File(".").getAbsolutePath()); log("\nuser.dir : " + System.getProperty("user.dir")); } public static void log(String s) { System.out.println(s); } } 

Você está esperando que o Eclipse execute o programa no diretório-raiz do projeto. A menos que você tenha feito algo especial com sua configuração “Executar”, eu ficaria surpreso se realmente começar lá.

Tente imprimir seu diretório de trabalho atual para garantir que esse seja o caminho certo.

Em seguida, tente verificar se o diretório bin / build contém seus arquivos “* .abc”, pois eles não são arquivos de origem Java e podem não ter sido copiados no diretório de saída da compilation.

Supondo que eles estejam no diretório de complementação, reescreva seu carregador de arquivos para usar um caminho relativo baseado no caminho da class do laoder. Isso funcionará bem em collections expandidas de arquivos .class em diretórios (e posteriormente em arquivos JAR compactados).

Em vez de tentar descobrir o que está acontecendo, por que não imprimir o que está acontecendo …

Faça essa alteração no seu código:

 log(myfile.getName() + "(full path=" + myfile.getAbsolutePath() + ") does not exist"); 

Você pode achar que ele não está usando o diretório que você pensa, ou (dependendo do seu sistema de arquivos) ele pode estar tentando criar um arquivo cujo nome é literalmente "src/mypackage/myscript.abc" – isto é, um nome de arquivo com barras embutidas.

você pode consertá-lo simplesmente declarando que lançar essa exceção. Como isso:

 public static void main(String args[]) throws FileNotFoundException{ FileReader reader=new FileReader("db.properties"); Properties p=new Properties(); p.load(reader); }