2013-08-26 58 views
0

XML文件正被用作臨時高速緩存以通過SOAP請求(多個配置值)存儲臨時值。多個線程將使用此文件,所以如果它已被更新,我不想寫入該文件。在第一遍代碼中,我期望緩存返回null,之後文件將被更新。但是,退出finally塊時我得到一個InvocationTargetException,程序失敗。我不明白爲什麼null CacheValues對象拋出異常。當使用反射預期的空指針會導致意外的InvocationTargetException

public class TempCache{ 
    private final ReadWriteLock myLock = new ReentrantReadWriteLock(); 
    private final MyCache cache = XmlCache.getInstance(); //creates singleton   
                  //instance, but doesn't 
                  //set values upon 
                  //initialization... 

    public CacheValues getCache(){ 
     Lock lock = myLock.readLock(); 
     CacheValues cv = null; 

     try{ 
      lock.lock(); 
      cv = cache.getCacheValues(); //returns null on the first pass... 

     }finally{ 
      lock.unlock(); 
     }     // exception thrown here 

     if(cv == null){ 
      refreshCache(); //submits SOAP request to set the xml cache values 
     } 

    ... 
} 
+0

NullPointerException可以在這裏被拋出的唯一方法是如果'cache'爲null或'getCacheValues'中的某些內容拋出NPE。可能需要您的堆棧跟蹤 –

+0

您可以檢查文檔以查看「getCacheValues」是否引發該異常。 – krsteeve

回答

1

一種的InvocationTargetException情況,和呼叫使用java.lang.reflect.Method製備。這可能發生在代理類或其他攔截,儀表類中。

當在調用中發生InvocationTargetException中包裝的異常時,您可以使用getCause()或查看堆棧跟蹤來獲取原始異常。