try block

时间:2015-11-09 08:30:39

标签: java try-catch bufferedreader

我有这个方法应该加载一个文件,但它给了我这个错误:

NamnMetod.java:175: error: unreported exception FileNotFoundException; must be caught or declared to be thrown
                 BufferedReader inFil = new BufferedReader(new FileReader(fil));
                                                           ^
NamnMetod.java:177: error: unreported exception IOException; must be    caught or declared to be thrown
                 String rad = inFil.readLine();  
                                            ^

这是我的代码:

   public static void hämtaFrånText() {
    try {
     EventQueue.invokeAndWait(new Runnable() {
     @Override

        public void run() {
              String aktuellMapp = System.getProperty("user.dir");
           JFileChooser fc = new JFileChooser(aktuellMapp);
           int resultat = fc.showOpenDialog(null);

              if (resultat != JFileChooser.APPROVE_OPTION) {
                 JOptionPane.showMessageDialog(null, "Ingen fil valdes!");
                 System.exit(0);
              }
                 String fil = fc.getSelectedFile().getAbsolutePath();
                 String[] namn = new String[3];         
                 String output ="";         
                 BufferedReader inFil = new BufferedReader(new FileReader(fil));                    
                 String rad = inFil.readLine();

                 int antal = 0;

                    while(rad != null){                  
                        namn[antal] = rad;
                        rad = inFil.readLine();
                        antal++;
                    }
                    inFil.close();

       }
    });                     
    }catch(IOException e2) {        
        JOptionPane.showMessageDialog(null,"The file was not found!");
    }           
}

我很困惑,因为我已经捕获了IOException和FileNotFoundException,但我仍然收到此错误......

5 个答案:

答案 0 :(得分:2)

您正在创建 Runnable的代码中捕获它们,而异常需要在 Runnable.run() 中捕获。

在您的run方法中移动try / catch。

此外,使用try-with-resources确保FileReader始终关闭,即使发生异常:

try (FileReader fr = new FileReader(fil);
     BufferedReader inFil = new BufferedReader(fr)) {
  // ...

  // No need to close `fr` or `inFil` explicitly.
}

答案 1 :(得分:0)

以下是解决方案:

public static void hämtaFrånText() {

        try {
            EventQueue.invokeAndWait(new Runnable() {

                @Override
                public void run() {
                    try {
                        String aktuellMapp = System.getProperty("user.dir");
                        JFileChooser fc = new JFileChooser(aktuellMapp);
                        int resultat = fc.showOpenDialog(null);

                        if (resultat != JFileChooser.APPROVE_OPTION) {
                            JOptionPane.showMessageDialog(null, "Ingen fil valdes!");
                            System.exit(0);
                        }
                        String fil = fc.getSelectedFile().getAbsolutePath();
                        String[] namn = new String[3];
                        String output = "";
                        BufferedReader inFil = new BufferedReader(new FileReader(fil));
                        String rad = inFil.readLine();

                        int antal = 0;

                        while (rad != null) {
                            namn[antal] = rad;
                            rad = inFil.readLine();
                            antal++;
                        }
                        inFil.close();
                    }catch(FileNotFoundException e1) {
                        JOptionPane.showMessageDialog(null,"The file was not found!");
                    }
                    catch(IOException e2) {
                        JOptionPane.showMessageDialog(null, "Failed!");
                    }
                }
            });
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }

    }

Reason:run是一个来自Runnable的方法,在eventQueue中已经定义了它,并且在方法定义中,没有在throw in方法声明语句中处理或添加异常的地方。因此,FileNoFoundException和IOException都应该在方法内部而不是在外部给出。

此外,EventQueue抛出了InterruptedException检查异常,我添加了另一个try catch来处理该异常。

希望它有所帮助。

答案 2 :(得分:0)

这里有范围问题。

您正在使用的try和catch将捕获hämtaFrånText()的例外但不是方法run()

异常可能发生在run方法内部,而不是在方面。

你给出的try-Cathc只会关心其范围内发生的异常,因为你没有抛出这些异常,不是你的hämtaFrånText()方法来处理run()内发生的事情。

如果run是您定义的方法,那么您可以扔掉它们。 但现在只有你可以选择在run()方法中捕获它们。

所以试试

public void run() {
try{
.............
...........

    }catch(FileNotFoundException e1) {
        JOptionPane.showMessageDialog(null,"The file was not found!");
        }
     catch(IOException e2) {
        JOptionPane.showMessageDialog(null, "Failed!");
    }
}

答案 3 :(得分:0)

try-catch块属于run() - " Runnable"的方法。 - 这个run() - 方法不能抛出任何异常。提交Runnable不会抛出异常。

答案 4 :(得分:0)

你需要在run方法中移动你的try catch块,这应该可以解决问题,你还需要处理InvocationTargetException抛出的InterruptedExceptionEventQueue.invokeAndWait(Runnable)来正确编译你的类。