这似乎是一个奇怪的问题,但是如果堆栈跟踪中存在 filenotfoundexception,是否可以“捕获”(知道)?我问这个是因为我正在实现的类(不是我的)不会抛出异常,它会捕获它并打印堆栈跟踪。
那么,换句话说,当堆栈跟踪中存在 filenotfoundexception 时,我可以显示带有自定义消息的 JOptionPane 吗?
谢谢!
这似乎是一个奇怪的问题,但是如果堆栈跟踪中存在 filenotfoundexception,是否可以“捕获”(知道)?我问这个是因为我正在实现的类(不是我的)不会抛出异常,它会捕获它并打印堆栈跟踪。
那么,换句话说,当堆栈跟踪中存在 filenotfoundexception 时,我可以显示带有自定义消息的 JOptionPane 吗?
谢谢!
这是一种使用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% 可靠(通过在调用期间锁定文件的解决方法是可能的),但这是首选。
我试试看:
[不是您打印堆栈跟踪的类:]
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 不是其中之一那些...