Получение исключения NullPointerException при инициализации интерфейса - PullRequest
0 голосов
/ 09 июля 2020

Я пишу проект maven под названием «error project». Его цель - обрабатывать исключения в других проектах. Он использует другой «менеджер конфигурации» проекта maven. Конечная цель менеджера конфигурации - получить учетные данные базы данных из некоторых файлов xml. В этом проекте есть «IExceptionService», и другим проектам предлагается записывать свои исключения через этот интерфейс. Конкретный класс этого интерфейса назначается во время выполнения классом «DependencyResolver». Присваивание было выполнено в методе «resolve» как таковом:

    @SuppressWarnings("unchecked")
public static <T> T resolve(Class<T> classType, HashMap<DependencyResolverParameter,String> parameterMap ) 
{
    try {
        
        if(classType == null)
            throw new ArgumanBosHatasi("classType is null");
        
        if(parameterMap == null)
            throw new ArgumanBosHatasi(HashMap.class.toString());           
        
        assert classType != null : "classType == null";

        if(classType.equals(IErrorRepository.class))            
            return (T)getIErrorRepository();                
        else if(classType.equals(IErrorFile.class))         
            return (T)getIErrorFile();              
        else if(classType.equals(ErrorBusinessRule.class))              
            return (T)getErrorBusinessRule();
        else if(classType.equals(IErrorService.class))
        {
            try {
                 
                return (T)getIErrorService(parameterMap);
                
            } catch (UygulamaHatasi applicationException) {
                throw applicationException;             }                               
        }       
        else
            throw new UnsupportedOperationException("Unknown class type.");
        
    } catch (Exception exception) {
     
        throw exception;            
    }
}
    
private static IErrorRepository getIErrorRepository() {
    
    try 
    {           
        if(errorDatabase != null)
            return errorDatabase;
        
        KonfigurasyonYoneticisi yonetici = new KonfigurasyonYoneticisi();
        
        String sifreKodu = "HATASIFRE";  
        String schema = yonetici.okuAyar("HATASCHEMA");
        String tabloAdi = yonetici.okuAyar("HATATABLOSU");
        String veritabaniUrl = yonetici.okuAyar("HATAVERITABANIURL"); //Here is line 92 in DependencyResolver
        String kullaniciAdi =  yonetici.okuAyar("HATAKULLANICIADI");
        
        if(SozceIsleri.bosMu(sifreKodu))
            throw new BasarisizIslemHatasi("sifreKodu boş geliyor.");
        
        if(SozceIsleri.bosMu(schema))
            throw new BasarisizIslemHatasi("schema boş geliyor.");          

        if(SozceIsleri.bosMu(tabloAdi))
            throw new BasarisizIslemHatasi("tabloAdi boş geliyor.");
        
        if(SozceIsleri.bosMu(veritabaniUrl))
            throw new BasarisizIslemHatasi("veritabaniUrl boş geliyor.");
        
        if(SozceIsleri.bosMu(kullaniciAdi))
            throw new BasarisizIslemHatasi("kullaniciAdi boş geliyor.");
        
        assert SozceIsleri.doluMu(sifreKodu) : "SozceIsleri.bosMu(sifreKodu)";
        assert SozceIsleri.doluMu(schema) : "SozceIsleri.bosMu(schema)";
        assert SozceIsleri.doluMu(tabloAdi) : "SozceIsleri.bosMu(tabloAdi)";
        assert SozceIsleri.doluMu(veritabaniUrl) : "SozceIsleri.bosMu(veritabaniUrl)";
        assert SozceIsleri.doluMu(kullaniciAdi) : "SozceIsleri.bosMu(kullaniciAdi)";            
    
        oracle.jdbc.OracleDriver oracleDriver = new oracle.jdbc.OracleDriver();
        
        lock();
        errorDatabase = new HataRepository(oracleDriver, veritabaniUrl,kullaniciAdi,sifreKodu,schema,tabloAdi);
        openLock();
        
        if(errorDatabase == null)
            throw new BosIsaretciHatasi(MesajIsleri.<IErrorRepository>getirBosGeliyorMesaji(IErrorRepository.class));
        
        return errorDatabase;
    
    } catch (BosIsaretciHatasi | BasarisizIslemHatasi hata) {
 
        throw hata;
    
    }finally {          
        openLock();         
    }    
}

«DependencyResolverParameter» является перечислением и имеет только значение «UYGULAMAANAHTAR». (КЛЮЧ ПРИЛОЖЕНИЯ)

Я вызываю этот метод так:

        int applicationKey = 4;
        
        HashMap<DependencyResolverParameter,String> map = new HashMap<DependencyResolverParameter,String>();            
        map.put(DependencyResolverParameter.APPLICATIONKEY, Integer.toString(applicationKey));
        
        IExceptionService service = DependencyResolver.<IExceptionService>resolve(IExceptionService.class, map);

Я определяю все необходимые зависимости внутри проекта. В приведенном выше коде переменная «service» не имеет значения null, как ожидалось, и она успешно записывает пробную ошибку всякий раз, когда я пишу ее внутри основного метода, как показано ниже:

public static void main(String[] args) {
    
    int applicationKey = 4;
    
    HashMap<DependencyResolverParameter,String> map = new HashMap<DependencyResolverParameter,String>();            
    map.put(DependencyResolverParameter.APPLICATIONKEY, Integer.toString(applicationKey));
    
    IExceptionService servis = DependencyResolver.<IExceptionService>resolve(IExceptionService.class, map);      
    
    System.out.println(String.format("is it null? %b", servis == null));
    
    servis.report(new Exception("trial error. Do not care."));  
} 

Однако, когда я пишу код внутри JUnit4 test Я получаю «NullPointerException», как показано ниже:

@Test
public void getHataService_001() {

    try 
    {           
        int applicationKey= 4;
        
        HashMap<DependencyResolverParameter,String> map = new HashMap<DependencyResolverParameter,String>();            
        map.put(DependencyResolverParameter.APPLICATIONKEY, Integer.toString(applicationKey));
        
        IExceptionService servis = DependencyResolver.<IExceptionService>resolve(IExceptionService.class, map);
        
        assertNotNull(servis);
        
    } catch (Exception exception) {         
        
        fail(exception.getMessage());
    }
}

Как я могу решить эту проблему? Заранее спасибо. Из трассировки стека я делаю вывод, что существует проблема чтения настроек из класса конфигурации.

зависимость junit:

<dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13</version>
    </dependency>

stacktrace:

m:java.lang.NullPointerExceptionlm:nullst:hata.businesslayer.dependencyresolvers.DependencyResolver.resolve(DependencyResolver.java:92)
kisi.core.crosscuttingconcern.exceptionhandling.HataIsleri.getHataService(HataIsleri.java:229)
kisi.core.crosscuttingconcern.exceptionhandling.HataIsleri.raporlaHata(HataIsleri.java:75)
test.hata.HataServisTesti.getHataService_001(HataServisTesti.java:62)
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.base/java.lang.reflect.Method.invoke(Method.java:567)org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)

2020/07/09 14:41:34
m:java.lang.NullPointerException
lm:nullst:hata.businesslayer.dependencyresolvers.DependencyResolver.resolve(DependencyResolver.java:92)
test.hata.HataServisTesti.getHataService_001(HataServisTesti.java:56)
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.base/java.lang.reflect.Method.invoke(Method.java:567)
org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)2020/07/09 14:41:34

1 Ответ

0 голосов
/ 14 июля 2020

Это из-за проекта apache maven внутри проекта. Когда я удаляю проект maven apache, он работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...