2012-11-30 13 views
6

sto cercando di ignorare init (ServletConfig config) Codice method.My è:servlet Java init override (ServletConfig config)

public void init(ServletConfig config) throws ServletException { 
    ServletContext sc = getServletContext(); // ----- NullPointerException 
} 

questo sta dando NullPointerException.

Se modifico come:

public void init(ServletConfig config) throws ServletException { 
    ServletContext sc = config.getServletContext(); // ----- works fine 
} 

Questo funziona bene. So che dovremmo sovrascrivere il metodo init() e non init (ServletConfig config) ma
Qualcuno può darmi ragione adeguata sul perché questo sta accadendo?

+1

Dove hai trovato che * dovremmo sovrascrivere il metodo 'init()' e non 'init (ServletConfig config)' *? –

+0

Non sto dicendo che non possiamo sovrascrivere il metodo init (ServletConfig config), ma possiamo leggere che il metodo init() è chiamato internamente dal metodo init (ServletConfig config), quindi dovremmo sovrascrivere il metodo init(). –

+0

Sembra che tu abbia già la tua risposta. Cos'altro hai bisogno? –

risposta

19

Confrontare la documentazione per init(ServletConfig):

 
public void init(ServletConfig config)throws ServletException 
Called by the servlet container to indicate to a servlet that the servlet 
is being placed into service. 

See Servlet#init. This implementation stores the ServletConfig object 
it receives from the servlet container for later use. When overriding 
this form of the method, call super.init(config). 

e confrontare che con la documentazione per init():

 
public void init() throws ServletException 
A convenience method which can be overridden so that there's no need to 
call super.init(config). 

Instead of overriding init(ServletConfig), simply override this method 
and it will be called by GenericServlet.init(ServletConfig config). The 
ServletConfig object can still be retrieved via getServletConfig(). 

Quando sovrascriviamo init(ServletConfig), la prima cosa che deve essere fatto è quello di chiamare:

super.init(config); 

Se si d Questo, quindi, chiamando direttamente a getServletContext() nel tuo metodo non determinerà più un NPE.

+0

significa dopo aver chiamato - super.init (config) ;, servlet otterrà il riferimento a servletcontext? –

+0

@RiteshKaushik sì, questo è ciò che significa. –

1

Perché in:

public void init(ServletConfig config) throws ServletException 
{ 
    ServletContext sc = getServletContext(); 
} 

non si richiama super.init(ServletConfig). Di conseguenza, ServletConfig non viene archiviato nell'istanza del servlet e le chiamate successive a getServletConfig restituiranno null.

2

Questo accade perché stai facendo override sbagliato meccanismo metodo Se l'override

 public void init(ServletConfig config) throws ServletException { 
     super.init(config); 
      ServletContext sc = getServletContext(); 
    } 

Invece di rilevante init(ServletConfig), semplicemente l'override del metodo qui sotto e si chiamerà con GenericServlet.init(ServletConfig config)

public void init() throws ServletException { 
ServletContext sc = getServletContext(); 
} 
0

Basta mettere il super init (config) nella prima riga del metodo sovrascritto

public void init(ServletConfig config) throws ServletException 
Problemi correlati