在堆栈跟踪中捕获FileNotFound?

时间:2013-05-10 15:05:18

标签: java stack filenotfoundexception

这可能看起来像一个奇怪的问题,但是如果堆栈跟踪中存在filenotfoundexception,是否可以“捕获”(知道)?我问这个是因为我正在实现的类(不是我的)不会抛出异常,它会捕获它并打印堆栈跟踪。

因此,换句话说,当堆栈跟踪中有filenotfoundexception时,是否可以使用自定义消息显示JOptionPane?

谢谢!

2 个答案:

答案 0 :(得分:1)

这是使用System.setErr和管道流的方式:
(完全可能有更好的方法或者可以简化)

public static void badFunctionCall()
{
  new FileNotFoundException("The file could not be found!").printStackTrace();
}

public static void main(String[] args) throws IOException
{
  PipedOutputStream writer = new PipedOutputStream();
  PipedInputStream reader = new PipedInputStream(writer);
  PrintStream p = new PrintStream(writer);
  System.setErr(p);

  badFunctionCall();

  p.close(); // do this *before* reading the input stream to prevent deadlock
  int c;
  StringBuilder builder = new StringBuilder();
  while ((c = reader.read()) != -1)
     builder.append((char)c);
  if (builder.toString().contains("java.io.FileNotFoundException: "))
     System.out.println("An error occurred! Caught outside function.");
  reader.close();
}

Test

请注意,可能不建议在同一个线程中连接流,或者至少有一个必须非常小心,因为非常很容易遇到死锁。

但更简单:

file.isFile() && file.canRead()
在函数调用之前

虽然不是100%可靠(可能在调用期间通过locking the file进行解决),但是首选。

答案 1 :(得分:0)

我试试看:

[不是打印堆栈跟踪的类:]

    catch ( Exception e ) {
      String trace = e.toString(); 
        // there are better methods than toString() in newer JDK versions, 
        // but for now it should work
      if ( trace.toLowerCase().indexOf( "filenotfoundexception" ) >= 0 ) {
        // there is one
        JOptionPane....what ever you want...
      }
    }

更新:

你不会得到被抑制的异常http://docs.oracle.com/javase/7/docs/api/java/lang/Throwable.html#getSuppressed() 但我强烈认为你的FileNot ......异常不是其中之一......