如果输出流不存在,如何使其生成文件?

时间:2013-10-30 06:24:25

标签: java exception makefile jbutton outputstream

我在创建输出流文件时遇到问题。

OutputStream output = new FileOutputStream(username + ".txt");
byte buffer[] = data.getBytes();
output.write(buffer);
output.close();

它工作正常,直到我做了另一种方法:

public void actionPerformed (ActionEvent e) //When a button is clicked
{
   if (e.getSource() == encrBtn)
   {
        menu.setVisible(false);
      createProfile();
      menu.setVisible(true);
   }
   else
   {
      if (e.getSource() == decrBtn)
      {
         menu.setVisible(false);
         viewProfile();
        menu.setVisible(true);
      }
      else
      {
         if (e.getSource() == exitBtn)
         {
            JOptionPane.showMessageDialog(null, "Goodbye!");
        System.exit(0);
         }
      }
   }
}

以前,我在调用

的每个方法的开头放置了Exception
createprofile();

方法(输出流是)。但现在我得到了

ProfileEncryption_2.java:54: error: actionPerformed(ActionEvent) in ProfileEncryption_2     cannot implement actionPerformed(ActionEvent) in ActionListener
public void actionPerformed (ActionEvent e) throws Exception //When a button is clicked
           ^
overridden method does not throw Exception

以前,我想知道是否有另一种方法可以抛出异常:cannot implement actionPerformed(ActionEvent) in ActionListener 但现在我认为以某种方式强制输出流来制作文件会更好。我用google搜索了多个这样的措词,但我现在知道怎么做了......我找到的东西也没用。

2 个答案:

答案 0 :(得分:1)

ActionListener接口未将其actionPerformed方法声明为抛出任何类型的Exception,您无法更改此签名。

您需要从方法中捕获并管理异常。

public void actionPerformed(ActionEvent e) //When a button is clicked
{
    if (e.getSource() == encrBtn) {
        menu.setVisible(false);
        try {
            createProfile();
        } catch (Exception exp) {
            exp.printStackTrace();
            JOptionPane.showMessageDialog(this, "Failed to create profile", "Error", JOptionPane.ERROR_MESSAGE);
        }
        menu.setVisible(true);
    } else {
        //...
    }
}
如果文件不存在,

FileOutputStream能够创建该文件,但如果路径没有,或者如果您没有足够的权限写入指定位置或任何其他位置,则可能会出现问题可能的问题......

答案 1 :(得分:0)

您的类型不匹配。 ActionListener接口的actionPerformed方法包含throws Exception子句,因此您不能在您覆盖的方法中包含一个子句。一个简单的解决方法是捕获任何抛出的Exception,并将其作为RuntimeException重新抛出。由于未选中RuntimeException,因此您无需将其包含在throws子句中。

public void actionPerformed (ActionEvent e) //When a button is clicked
{
  try { // <-- Added try block
     if (e.getSource() == encrBtn)
     {
          menu.setVisible(false);
        createProfile();
        menu.setVisible(true);
     }
     else
     {
        if (e.getSource() == decrBtn)
        {
           menu.setVisible(false);
           viewProfile();
          menu.setVisible(true);
        }
        else
        {
           if (e.getSource() == exitBtn)
           {
              JOptionPane.showMessageDialog(null, "Goodbye!");
          System.exit(0);
           }
        }
     }
  }
  catch (Exception e) { // <-- Catch exception
    throw new RuntimeException(e); // <-- Re-throw as RuntimeException
  }
}

如果可能的话,实际上通常会更好地处理异常,但是如果你只想查看异常(例如调试),那么我会说将它包装在RuntimeException并重新抛出它是一个比在所有方法签名的末尾添加throws Exception更清洁。如果您可以将Exception块中的catch类型缩小到您期望的实际异常类型,也会更好。