2013-06-18 7 views
7

Po pierwsze, jestem doświadczonym programistą, ale mam bardzo małą znajomość Javy. Mam z nim około dwuletnie doświadczenie, osiem lat temu.Nullpointerexception java

Dostaję NullPointerException w poniższym kodzie:

public static void handle(HttpServletRequest request,HttpServletResponse response)throws IOException,ServletException { 

    Response gfexResponse = null; 

    try { 

     ActionFactory actionFactory = ActionFactory.getInstance(); 
     String requestURL = request.getRequestURI(); 
     String actionId = actionFactory.getActionId(requestURL); 

     IAction action = actionFactory.createAction(actionId); 

     ActionEvent event = new ActionEvent(request, 0, actionId); 
     gfexResponse = action.execute(event); 

    } catch (Exception ex) {   
     gfexResponse = new Response(); 
     gfexResponse.setError(ex.getMessage()); 
     gfexResponse.setOutcome(IViewConstants.ERROR); 

    } finally { 

     if(request.getParameter("loginId") != null){ 
      request.setAttribute("loginId", request.getParameter("loginId")); 
     } 

     if(gfexResponse.getMessage()!= null){ 
      request.setAttribute("message", gfexResponse.getMessage()); 
     } 

     if(gfexResponse.getError()!= null){ 
      request.setAttribute("error", gfexResponse.getError()); 
     } 

     if (gfexResponse.getContentType() != null) { 
      response.setContentType(gfexResponse.getContentType()); 
      OutputStream outputStream = response.getOutputStream(); 
      outputStream.write(gfexResponse.getOutputData()); 
      outputStream.flush(); 
      outputStream.close(); 
     } 

     if(gfexResponse.getOutcome() != null){ 
      RequestDispatcher dispatcher = request.getRequestDispatcher(gfexResponse.getOutcome()); 
      dispatcher.forward(request, response); 
     } 
    }  
} 

Oto StackTrace:

[6/18/13 17:10:04:518 GMT] 00000023 ServletWrappe E SRVE0068E: Uncaught exception thrown in one of the service methods of the servlet: GfexServlet. Exception thrown : java.lang.NullPointerException 
    at com.svl.gfex.handlers.RequestHandler.handle(RequestHandler.java:44) 
    at com.svl.gfex.servlets.GfexServlet.processRequest(GfexServlet.java:43) 
    at com.svl.gfex.servlets.GfexServlet.doPost(GfexServlet.java:39) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:763) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:856) 
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:966) 
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:907) 
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:118) 
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain._doFilter(WebAppFilterChain.java:87) 
    at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:701) 
    at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:646) 
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:475) 
    at com.ibm.ws.wswebcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:463) 
    at com.ibm.ws.webcontainer.webapp.WebApp.handleRequest(WebApp.java:3129) 
    at com.ibm.ws.webcontainer.webapp.WebGroup.handleRequest(WebGroup.java:238) 
    at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:811) 
    at com.ibm.ws.wswebcontainer.WebContainer.handleRequest(WebContainer.java:1433) 
    at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:93) 
    at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:465) 
    at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewInformation(HttpInboundLink.java:394) 
    at com.ibm.ws.http.channel.inbound.impl.HttpICLReadCallback.complete(HttpICLReadCallback.java:102) 
    at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:152) 
    at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:213) 
    at com.ibm.io.async.AbstractAsyncFuture.fireCompletionActions(AbstractAsyncFuture.java:195) 
    at com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:136) 
    at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:194) 
    at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:741) 
    at com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:863) 
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1510) 

punktów StackTrace do linii:

 if(gfexResponse.getMessage()!= null){ <-------- this line 
      request.setAttribute("message", gfexResponse.getMessage()); 
     } 

Ten kod został utrzymywane przez wykonawcę morskiego, ale firma zwolniła wszystkich wykonawców. Za moje grzechy dostałem zadanie naprawienia tego.

Jeśli ktoś może mi pomóc dowiedzieć się, dlaczego dostaję ten błąd, byłbym wdzięczny.

+2

Dodaj sprawdzenie, czy 'gfexResponse == null'. Wyjątki wskaźnika NULL w Javie są zwykle bardzo łatwe do debugowania, ponieważ próbujesz wywołać metodę na obiekcie zerowym. –

Odpowiedz

11

Błąd ten wskazuje, że sam obiekt gfexResponse jest null (tj action.execute(event) wraca null w powyższym kodzie, a nie wyjątek jest rzucony)

+1

+1 Niezły chwyt o akcji.execute (zdarzenie) '. Twoja odpowiedź jest jedyną, która mówi, dlaczego 'gfexResponse' jest' null' .. –

1

Faktycznie problem leży na linii gfexResponse = action.execute(event);

tylko szansa Poniższa linia dostać NPE tutaj jest gfexResponse jest null

if(gfexResponse.getMessage()!= null){ <-------- this line 

go zmienić na

if(gfexResponse!=null && gfexResponse.getMessage()!= null){ <-------- this line 
+0

Dzięki. Próbowałem, wciąż otrzymuję ten sam wyjątek w tym samym punkcie. – Kevin

+0

Wyobraźcie sobie to, dzięki! Myliłem się, że wysadził w tym samym punkcie. – Kevin

1

Czy jesteś pewien, że gfexResponse jest uzyskanie rzeczywistej wartości od action.execute(event); (w try {})? Zgaduję, że action.execute(event); zwraca wartość null.

+0

Chyba muszę wymyślić, jak korzystać z trybu debugowania. – Kevin

4

Twój podstawowy zarys jest taki:

public static void handle(HttpServletRequest request,HttpServletResponse response)throws IOException,ServletException { 

    Response gfexResponse = null; 

    try { 
     //Try to get your gfexResponse 
    } catch (Exception ex) {   
     //Provide a default gfexResponse 
    } finally { 
     //Do some stuff with gfexResponse 
    }  
} 

To zła praktyka: próbujesz użyć wyjątek obsługi do sterowania przepływem. Ponadto zakładasz, że metoda, której użyjesz, aby uzyskać gfexResponse , spowoduje zgłoszenie wyjątku, jeśli się nie powiedzie, co oczywiście nie powoduje. (Niektóre proste debugowanie/śledzenia ujawni to bezpośrednio.)

Co należy robić to:

public static void handle(HttpServletRequest request,HttpServletResponse response)throws IOException,ServletException { 

    Response gfexResponse = null; 

    try { 
     //Try to get your gfexResponse 
     //Make sure you got your response object and throw SomeAppropriateException if not 
     //Do some stuff with gfexResponse 
    } catch (SomeAppropriateException e) { 
     //properly handle this case 
    } catch (Exception ex) { 
     //properly handle the general case that something else failed (But you should try to be more specific) 
    } finally { 
     //remove any resources that might not be properly cleaned up if an exception is thrown. 
    }  
} 
+0

Masz rację co do tego, że to zła praktyka, @Nathaniel Ford. Niestety, w taki sposób został pierwotnie zakodowany, a nikt w zarządzie nie będzie w stanie ponosić wydatków na naprawę tego wszystkiego. To tylko niewielka strona internetowa, ale pierwotni programiści obsługiwali kontrolę przepływu w taki sam sposób wszędzie. – Kevin

1

Aby rozwiązać natychmiastowy ból - rozmowa action.execute(event); jest prawdopodobny powrót null. Jednak może to być złagodzone na kilka sposobów:

  • Null sprawdzenie, czy
  • Obrócenie bloku try-catch w osobnym wywołanie metody, aby powrócić Response.

Stamtąd blok finally staje się głównym tematem swojej metodzie, można sprawdzić dla wartości null, bez konieczności martwienia się o finally.