2017-02-02 4 views
0

Java 1.8을 사용하고 있습니다.프록시 객체가 NullPointerException을 throw합니다.


     ConsumerExecutor exec = ConsumerFactory.newInstance(ExecutorInvocationHandler.class, 
       Executors.newCachedThreadPool()); 
     //do something here 
     while (!exec.isTerminated()) {//line 52 
     } 
     //do soemthing 
: JUnit 테스트에서 실행


public class ExecutorInvocationHandler implements InvocationHandler { 

    private boolean close = false; 
    private ExecutorService executor; 

    public ExecutorInvocationHandler(ExecutorService exec) { 
     this.executor = exec; 
    } 

    @Override 
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 

     if (method.getName().equals("closed")) { 
      return closed(); 
     } else if (method.getName().equals("shutdown")) { 
      _close(); 
      executor.shutdown(); 
     } else if (method.getName().equals("shutdownNow")) { 
      _close(); 
      executor.shutdownNow(); 
     } else { 
      method.invoke(executor, args); 
     } 

     return null; 
    } 

    public synchronized void _close() { 
     close = true; 
    } 

    public synchronized boolean closed() { 
     return close; 
    } 
} 

이제 다음 코드

여기

public interface ConsumerExecutor extends ExecutorService{ 

    boolean closed(); 

} 

InvocationHandler 클래스 : 여기

ExecutorService를 확장 내 인터페이스입니다

이 예외를 throw합니다.


java.lang.NullPointerException 
    at com.sun.proxy.$Proxy3.isTerminated(Unknown Source) 
    at test.de.edigrid.util.upgrade_test.tasks.ContextsCollectorTest.collectorTest(ContextsCollectorTest.java:52) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:252) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189) 
    at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165) 
    at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85) 
    at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115) 
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75) 

프록시 팩토리 메소드은 여기에 있습니다 :


    public static ConsumerExecutor newInstance(Class clazz, ExecutorService exec) { 
     if (clazz == ExecutorInvocationHandler.class) { 
      return (ConsumerExecutor) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), 
        new Class[] { ConsumerExecutor.class }, new ExecutorInvocationHandler(exec)); 
     } 
     return null; 
    } 

는 아무도 나에게 힌트를 줄 수있는 이유 예외?

답변

0

문제는 함수 반환과 관련이 있습니다. return 성명 뒤에 method.invoke(...)을 넣는 것을 잊어 버렸습니다. 그것은 다음과 같아야합니다 :


    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 

     if (method.getName().equals("closed")) { 
      return closed(); 
     } else if (method.getName().equals("shutdown")) { 
      _close(); 
      executor.shutdown(); 
     } else if (method.getName().equals("shutdownNow")) { 
      _close(); 
      return executor.shutdownNow(); 
     } else { 
      return method.invoke(executor, args); 
     } 

     return null; 
    }