FileNotFoundException 有时会被抛出,我不知道为啥

Posted

技术标签:

【中文标题】FileNotFoundException 有时会被抛出,我不知道为啥【英文标题】:FileNotFoundException is being thrown sometimes and i don't know whyFileNotFoundException 有时会被抛出,我不知道为什么 【发布时间】:2015-11-09 23:02:01 【问题描述】:

我正在尝试运行一个返回 XML 格式的 Web 服务,但它有时会在 3G 网络上抛出 FileNotFoundException,有时在 WIFI 网络上会成功运行

这是连接的代码:

      @Override
    protected ArrayList<NewsItemVO> doInBackground(Void... args) 


        try 
            URLConnection conn = new URL(feedUrl).openConnection();
            conn.setConnectTimeout(20000);
            conn.setReadTimeout(20000);
            InputStream in = new BufferedInputStream(conn.getInputStream());
          

这是抛出异常的那一行

 InputStream in = new BufferedInputStream(conn.getInputStream());

【问题讨论】:

【参考方案1】:

在使用输入流之前,您可以检查它是否可用?

http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html

【讨论】:

输入流尚未使用,它只是初始化,所以我认为问题出在“conn.getInputStream()” 我不知道这是否有区别,但您可以尝试 java.net.URL 的 openStream 方法。【参考方案2】:

根据文档:

表示尝试打开由指定路径名表示的文件失败的信号。

当具有指定路径名的文件不存在时,FileInputStream、FileOutputStream 和 RandomAccessFile 构造函数将抛出此异常。如果文件确实存在但由于某种原因不可访问,例如当试图打开一个只读文件进行写入时,这些构造函数也会抛出它。

由于您的代码在大多数情况下都在工作,而在某些时候不工作,我怀疑您正在获得 ConnectionTimeOut。

要进一步挖掘问题,请按照以下步骤操作。

1) 声明一个长变量 t1 并在 try 块之前将其初始化为 System.currentTimeMillis()。再声明一个长变量 t2 并在 finally 块后获取当前时间。检查差异。如果差异大于连接超时设置,我们可以断定您正在获得连接超时。

2) 在 catch 子句中打印完整的异常堆栈跟踪。

3) 当您遇到此异常时,请检查文件的权限并确认该文件可通过读取/执行权限访问。

还有一件事 - 由于它在 wifi 下工作正常而在 3G 下工作不正常,我怀疑连接超时是根本原因。

【讨论】:

以上是关于FileNotFoundException 有时会被抛出,我不知道为啥的主要内容,如果未能解决你的问题,请参考以下文章

Liquibase - ZipFile.java 中的 FileNotFoundException

java.io.FileNotFoundException: ...my_flutter/.android/include_flutter.groovy

向 Solr 核心添加字段时,为啥会出现“ManagedIndexSchema Error persisting managed schema => FileNotFoundException:

ApplicationSettingsBase 中的 FileNotFoundException

关于FileFOutputStream应用中的FileNotFoundException问题

java.io.FileNotFoundException: localhost/broadcast_1