jacob常用异常处理 (2011-03-10 15:06:57)
转载
▼
标签: jacob 异常 comfail exception dispid open illegal state it 分类: JAVA
com.jacob.com.ComFailException: Can’t map name to dispid: Open
这种异常是因为操作完成后,没有调用ComThread.Release()去释放jacob
java.lang.IllegalStateException: Dispatch not hooked to windows memory
这种异常有可能是多次调用了ComThread.Release();而引起的。
但我今天碰到这种异常,却不是这样,在初始化jacob所需的对象的时候,会做一个判断:
if (word == null) {
word = new ActiveXComponent(“Word.Application”);
word.setProperty(“Visible”, new Variant(false));
word.setProperty(“DisplayAlerts”, new Variant(false));
}
if (documents == null) {
documents = word.getProperty(“Documents”).toDispatch();
}
这里的word和documents是Dispatch类型。
然后每次操作完成后都会调用ComThread.Release()去释放,但释放后word和documents并不为null,所以每次使用jacob都只有第一次是正常的,后面就要报错,然后必须重启tomcat才行。
问题就出在初始化的判断上了,要这样写:
if (word == null||word.m_pDispatch0) {
word = new ActiveXComponent(“Word.Application”);
word.setProperty(“Visible”, new Variant(false));
word.setProperty(“DisplayAlerts”, new Variant(false));
}
if (documents == null||documents.m_pDispatch0) {
documents = word.getProperty(“Documents”).toDispatch();
}
这样可以正常初始化jacob,后面的操作也不会报异常了。