如何使OutputStream中做出一个文件,如果它不存在?(How to make outputs

2019-10-18 21:11发布

我有一个创建一个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);
         }
      }
   }
}

以前,我把每于调用方法开始抛出异常

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

以前,我是想知道是否有另一种方式来抛出异常: 在ActionListener的无法实现的actionPerformed(ActionEvent的),但现在我认为,这将是更好的以某种方式强制的OutputStream使文件。 我用Google搜索的这种多措辞,但现在我知道如何做到这一点...我发现的东西也不能工作。

Answer 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能够创建的文件,如果它不存在的,但是,如果路径不,或者如果你没有足够的权限写入到指定位置或任意数量的其他可能的问题可能有问题...



Answer 2:

你得到一个类型不匹配。 该ActionListener接口的actionPerformed方法包括throws Exception从句,因此你不能包含一个你覆盖的方法。 一个简单的解决方法是捕捉任何Exception抛出,并重新把它作为一个RuntimeException 。 由于RuntimeException s为未选中,你不需要把它列入了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在您所有的方法签名的结束。 这也是更好,如果你可以缩小的类型, Exceptioncatch块下降到你期望的实际异常类型。



文章来源: How to make outputstream make a file if it doesn't exist?