【问题标题】:Why can there be an ArrayOutOfBounds Exception when you are opening a file in java using FileInputStream?为什么使用 FileInputStream 在 java 中打开文件时会出现 ArrayOutOfBounds 异常?
【发布时间】:2015-06-25 22:27:21
【问题描述】:

为什么需要在java中检查FileInputStream中的ArrayIndexOutOfBounds?在一本关于核心 java 的书中给出了相同的代码作为示例。

FileInputStream fis;
try{
    //fis=new FileInputStream("inputFIle.txt");       
    fis=new FileInputStream(argv[0]);
}catch(FileNotFoundException e){
    System.out.println("File was not found");
}catch(ArrayIndexOutOfBoundsException e){
    e.printStackTrace();
}

【问题讨论】:

  • 不能。据我所知,这只是一个非常糟糕的例子——假设你已经准确地复制了它。
  • 也许原代码中的try块包含其他可能抛出ArrayIndexOutOfBoundsException的方法调用。您发布的代码没有通过编译。
  • @Eran 是的。这是一个未经检查的异常。
  • @user2025949 请提供正确的引文:作者、标题、版本、章节和页码。
  • @EJP 关于ArrayIndexOutOfBoundsException 未被选中是正确的。但是,发布的代码包含ArrayIndexOutOfBounds。我不知道那是什么:)

标签: java exception-handling io inputstream indexoutofboundsexception


【解决方案1】:

没有必要。如果您查找 FileInputStream 的文档:

构造函数详细信息

FileInputStream
public FileInputStream(String name) 抛出 FileNotFoundException

通过打开与实际文件的连接来创建 FileInputStream,该文件>由路径命名 name 文件系统中的名称。创建了一个新的 FileDescriptor 对象 来表示这个文件连接。首先,如果有安全 manager,它的 checkRead 方法以 name 参数作为其调用 论据。

如果命名文件不存在,是目录而不是常规 文件,或由于某些其他原因无法打开读取然后 抛出 FileNotFoundException。

参数: name - 系统相关文件名。抛出:

FileNotFoundException - 如果文件不存在,就是目录 而不是常规文件,或由于某些其他原因无法打开 供阅读。

SecurityException - 如果存在安全管理器并且它的 checkRead 方法拒绝读取文件。

该构造函数不会抛出 ArrayIndexOutOfBounds。可能只是为了显示语法而编写的一个小示例,或者在 try 块中有一些其他代码。

【讨论】:

    【解决方案2】:

    在一本关于核心 java 的书中给出了相同的代码作为示例。

    不,它不是

    我不厌其烦地检查了这一点。原始代码使用argv[0] 作为文件名而不是拼写错误的字符串文字,显然数组引用会引发该异常。您错误地引用了您所依赖的文本。

    【讨论】:

    • @EPJ 所以你认为作为字符串参数的文件名不能作为 FileInputStream 构造函数的输入?我的代码类似于此代码,我只是问 - 为什么需要检查 ArrayIndexOutOfBounds 的异常
    • 而且,如果你不得不接受,我不认为帮助别人是件麻烦事。
    • 当然文件名可以作为字符串传递给FileInputStream。这就是你的代码和书中的代码所做的。在这一点上,我不在乎你怎么想。我反对浪费我的时间,因为你改了代码,又没有说出来,误导了大家一个星期,对这本书造成了完全错误的印象;我不喜欢下载一个大的 PDF 并翻到第 325-6 页,只是发现你没有说实话。最后,当您更改代码时,您也更改了可能引发的异常。这肯定很明显吗?
    • @EPJ:你知道吗——现在我得到了答案。我做错了,但你不能给出正确的答案。包含 ArrayOutOfBoundException 的实际原因是本书使用了 argv[] ARRAY,这可能会引发 ArrayIndexOutOfBounds 异常。这是你所期望的。我的问题不是“-1”。
    • 我没有足够的声望点来上传图片/截图。这就是原因-您必须下载pdf。虽然,我很感激你承担了下载 pdf 的负担。无论如何,谢谢你让我发现了错误。
    【解决方案3】:

    FileInputStream 中显式捕获 ArrayIndexOutOfBoundsException 的可能性只有 当您以数组值(如 arg[0)的形式将输入提供给 FileInputStream 构造函数时]。因为,很有可能在命令行中,您可能只给出了一个参数,但您正在尝试访问 argv[1] 或 argv[2]。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-24
      • 1970-01-01
      • 2017-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多