0

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

那么,换句话说,当堆栈跟踪中存在 filenotfoundexception 时,我可以显示带有自定义消息的 JOptionPane 吗?

谢谢!

4

2 回答 2

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();
}

测试

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

但更简单:

file.isFile() && file.canRead()

在函数调用之前,虽然不是 100% 可靠(通过在调用期间锁定文件的解决方法是可能的),但这是首选。

于 2013-05-10T16:01:00.107 回答
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...Exception 不是其中之一那些...

于 2013-05-10T15:09:49.293 回答