这可能看起来像一个奇怪的问题,但是如果堆栈跟踪中存在filenotfoundexception,是否可以“捕获”(知道)?我问这个是因为我正在实现的类(不是我的)不会抛出异常,它会捕获它并打印堆栈跟踪。
因此,换句话说,当堆栈跟踪中有filenotfoundexception时,是否可以使用自定义消息显示JOptionPane?
谢谢!
答案 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();
}
请注意,可能不建议在同一个线程中连接流,或者至少有一个必须非常小心,因为非常很容易遇到死锁。
但更简单:
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 ......异常不是其中之一......