1

我创建了一个简单的程序,该程序将使用以下代码编写带有目录的文件:

 String nameProve = nameField.getText();

 String employee = ("C:\\Users\\ALLEN\\workspace32bit\\RETRIEVE_CHECKER1\\RETRIEVE_CHECKED1" + nameProve + ".txt");

 PrintWriter outputStream1 = null;
 try
 {
    outputStream1 = new PrintWriter(employeeName);
 }
 catch(Exception e)
 {
    JOptionPane.showMessageDialog(null, "Can not write to " + employeeName);
    System.exit(0);
 }

 outputStream1.println("Employee Retrieve Executed");
 outputStream1.close();

我已经将我的代码导出到 .jar 文件,如果我在计算机中执行它,我的代码工作得很好,如果我已经开发了我的程序,但是当我将 jar 文件复制到其他计算机并且我还创建了 forlder(手动) 与我的代码中的目录相对应,我的程序不起作用,我的 catch 块将显示消息 Can not write to "C:\Users\ALLEN\workspace32bit\RETRIEVE_CHECKER1\RETRIEVE_CHECKED1" + nameProve + ".txt"

谁能给我一些关于如何解决这个错误的建议?谢谢!

4

2 回答 2

0

您捕获的异常将包含所有详细信息 - 例如访问被拒绝、目录不存在等。目前,您在捕获异常数据(消息、堆栈跟踪)时会丢失它。

请做类似的事情

  • 不要只捕获java.lang.Exception。这太宽了-将捕获可能的NullPointerException并显示误导性消息“无法写入”。仅捕获特定异常-实际上是从 try 块抛出的异常。在您的情况下,这将是java.io.FileNotFoundException
  • 不要丢失异常细节。将其打印到标准错误日志,甚至更好地使用日志框架

解决这些问题的 catch 块:

catch(FileNotFoundException e) {
    JOptionPane.showMessageDialog(null, e.getMessage());
    e.printStackTrace();
}
于 2014-10-08T10:54:07.023 回答
0

显然,您是ALLEN您机器上的用户并以该用户身份运行程序,所以一切正常,因为您是目录的所有者C:\Users\ALLEN

然后您将 jar 复制到另一台机器,该用户ALLEN不存在并且您以另一个用户身份登录,假设他的名字是Bob并创建该目录 unter C:\Users。您可能已经注意到,当您想要创建该目录时,用户Bob窗口已警告您需要管理员权限才能完成此操作。

现在,您尝试Bob使用只能访问他自己的目录的用户运行您的程序,C:\Users\Bob并尝试写入ALLEN自己的目录。所以发生的事情是你得到一个IOException告诉你access denied这是好的!

你不应该尝试写给其他用户的私人目录,这是一个安全问题。

在处理文件系统的代码中,切勿硬编码绝对路径,始终使用相对路径,或者如果您需要定义一个目录,您的程序所需的所有数据都应该位于该目录中,然后将 ist 作为参数传递。

最简单的方法是使用以下内容并使用当前工作目录

String employee = "RETRIEVE_CHECKER1\\RETRIEVE_CHECKED1" + nameProve + ".txt";

您需要RETRIEVE_CHECKER1在运行程序的位置手动创建目录,或者更好的是在程序中使用File#mkdir并像这样使用它:

File employee = new File(dir, "RETRIEVE_CHECKED1" + nameProve + ".txt");
PrintWriter outputStream1 = new PrintWriter(employeeName);
于 2014-10-08T10:20:08.477 回答