Java.lang.NullPointerException

30 respostas
jeovane.reges
Olá a todos, boa tarde. Pessoal estou tendo o seguinte problema: Tenho um formulário onde a partir dele passo uma String e pego o valor dessa String a partir de um servlet. No entanto, sempre que tento resgatar o valor dessa String me é retornado null. O código abaixo representa o meu servlet
protected void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
  OWLUtils utils = new OWLUtils();
  // Pego o valor da String que vem do formulário
  utils.setUri(request.getParameter("addressDom"));

  RequestDispatcher rd = request.getRequestDispatcher("/page-loaded-ontology.jsp");
  rd.forward(request, response);
}
Da maneira que estar sempre que vou utilizar o getUri() na minha classe OWLUtils sempre é retornado o seguinte erro abaixo
java.lang.NullPointerException
	java.io.File.<init>(File.java:251)
	example.ontologie.util.OWLUtils.<init>(OWLUtils.java:53)
	example.ontologie.servlet.LoadsOntologiesServlet.service(LoadsOntologiesServlet.java:23)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
Minha classe OWLUtils estar da seguinte maneira abaixo.
public class OWLUtils {
    private String uri;
    private File file = new File(getUri());

    private OWLOntology loadOntology() throws OWLOntologyCreationException {
        this.ontology = manager.loadOntologyFromOntologyDocument(getFile());
        return this.ontology;
    }    

    public String getUri() {
        return uri;
    }

    public void setUri(String uri) {
        this.uri = uri;
    }

    public File getFile() {
        return file;
    }

    public void setFile(File file) {
        this.file = file;
    }
}
Alguém saberia me dizer aonde que estou errando e o que devo fazer pra concertar esse erro? Por fim, o meu web.xml estar da seguinte maneira abaixo.
<servlet>
  <servlet-name>LoadsOntologies</servlet-name>
  <servlet-class>
    example.ontologie.servlet.LoadsOntologiesServlet
  </servlet-class>
</servlet>

<servlet-mapping>
  <servlet-name>LoadsOntologies</servlet-name>
  <url-pattern>/loads-ontologies</url-pattern>
</servlet-mapping>

30 Respostas

DaniloAndrade

Coloca seu jsp ai pra gente analisar

pmlm

Estás a criar o teu file no momento em que é criado o novo objecto. Nesse momento, uri é sempre null.

DaniloAndrade
public class OWLUtils {  
    private String uri;  
    private File file = new File(getUri());  //vc ta dando um getUri(); sendo que o valor do seu atributo uri é nullo vai dar nullpointer mesmo
  
    private OWLOntology loadOntology() throws OWLOntologyCreationException {  
        this.ontology = manager.loadOntologyFromOntologyDocument(getFile());  
        return this.ontology;  
    }      
  
    public String getUri() {  
        return uri;  
    }  
  
    public void setUri(String uri) {  
        this.uri = uri;  
    }  
  
    public File getFile() {  
        return file;  
    }  
  
    public void setFile(File file) {  
        this.file = file;  
    }  
}

instancie o File no construtor

public class OWLUtils {  
    private String uri = null;  
    private File file = null;
     
    public OWLUtils (String uri){ //crie um construtor que receba sua uri e instancie o File no construtor
       file = new File(uri);
       this.uri = uri;

    }


    private OWLOntology loadOntology() throws OWLOntologyCreationException {  
        this.ontology = manager.loadOntologyFromOntologyDocument(getFile());  
        return this.ontology;  
    }      
  
    public String getUri() {  
        return uri;  
    }  
  
    public void setUri(String uri) {  
        this.uri = uri;  
    }  
  
    public File getFile() {  
        return file;  
    }  
  
    public void setFile(File file) {  
        this.file = file;  
    }  
}
jeovane.reges
O JSP no qual o meu input se encontra estar da seguinte maneira abaixo.
<form name="formulario" method="post" action="loads-ontologies" target="">
 <div class="campoForm">
    <div class="campoForm left">
        <input type="text" name="addressDom" id="addressDom" style="width:400px;" />
        <input type="submit" name="submitLoad" id="sumitLoad" value="Load"  class="botaoForm" />
    </div>
 </div>
</form>
jeovane.reges

DaniloAndrade e pmlm o que devo fazer pra contornar esse problema?
Em qual momento devo criar o meu File?

Obrigado pela atenção.

DaniloAndrade

na verdade o erro ta na sua classe OWLUtils,

da uma olhada no minha resposta anterior

DaniloAndrade

jeovane.reges:
DaniloAndrade e pmlm o que devo fazer pra contornar esse problema?
Em qual momento devo criar o meu File?

Obrigado pela atenção.

instancie seu File no construtor

recebendo sua uri como parametro do construtor

jeovane.reges
Olá DaniloAndrade. Fiz o construtor da maneira que você disse e alterei o meu servlet deixando-o da seguinte maneira abaixo.
protected void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
  String domainOntology = request.getParameter("addressDom");
  OWLUtils utils = new OWLUtils(domainOntology);
  RequestDispatcher rd = request.getRequestDispatcher("/page-loaded-ontology.jsp");
  rd.forward(request, response);
}
Mas, infelizmente continua dando erro. Fazendo alguns testes, quando mando imprimir o file dentro do construtor que criei ele me retorna o valor da String uri normalmente.

No entanto, quando mando imprimi-lo dentro dentro do metodo loadOntology() ele me retorna null.

Detalhe, tive que criar dois construtores, dessa forma ficando da seguinte maneira abaixo.
public OWLUtils() {
    }

    public OWLUtils(String uri) {
        file = new File(uri);
        this.uri = uri;
    }
DaniloAndrade

em que lugar vc ta mando imprimir

loadOntology()

DaniloAndrade

outra coisa,

private OWLOntology loadOntology() throws OWLOntologyCreationException {    
        this.ontology = manager.loadOntologyFromOntologyDocument(getFile());    // de onde esta vindo esse manager, eu não vi vc instanciando ele em nem um lugar dessa classe, ela nem é um atributo da classe
        return this.ontology;    
    }
jeovane.reges
Na postagem resumir a classe OWLUtils. Resolvi o problema parcialmente, criei uma nova classe chamada OWLPages na qual o seu código encontra-se da seguinte maneira abaixo.
public class OWLPages {
    private String uri;

    public String getUri() {
        return uri;
    }

    public void setUri(String uri) {
        this.uri = uri;
    }
    
}
Meu servlet ficou da seguinte maneira abaixo.
protected void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        OWLPages pages = new OWLPages();
        pages.setUri(request.getParameter("addressDom"));
        
        OWLUtils utils = new OWLUtils(pages.getUri());
        
        RequestDispatcher rd = request.getRequestDispatcher("/page-loaded-ontology.jsp");
        rd.forward(request, response);
}
No entanto, no momento que dou o meu submit acabo perdendo o valor do getUri() da minha classe OWLPages. Preciso dele, porque na minha página page-loaded-ontology.jsp faço novamente a chamada do construtor da classe OWLUtils. O código da minha página page-loaded-ontology.jsp encontra-se da seguinte maneira abaixo.
<div class="menuLeft">
    <h2>Classes</h2>
    <ul class="menuClasses">
        <%
            BuildsHierarchyDataProperty bhdp = new BuildsHierarchyDataProperty();
            String teste = "/home/jeovane/Dropbox/Public/Onto_DD.owl";
            OWLUtils ou = new OWLUtils(teste);

            ou.ontologyLoaded();

            for (Iterator it = bhdp.buildsHierarchy(ou.getOntology()).entrySet().iterator(); it.hasNext();) {
                Map.Entry entry = (Map.Entry) it.next();
                String key = ou.getPm().getShortForm((OWLEntity) entry.getKey()).replace(":", "");
                ArrayList<OWLEntity> arrayValues = (ArrayList<OWLEntity>) entry.getValue();
        %>
        <li>
            <a href="#" class="itemMenu" id="<%=key%>">+ <%=key%></a>
            <div class="conteudoMenu">
            <%
                for (OWLEntity owlEntity : arrayValues) {
                    String valueKey = ou.getPm().getShortForm(owlEntity).replace(":", "");
            %>
                <a href="#" id="<%=valueKey%>">- <%=valueKey%></a>
            <%
                }
            %>
            </div>
        </li>
        <%
            }
        %>
    </ul>
</div>
Como pode ver, a minha variável teste declaro explicitamente o valor que é armazenado em pages.setUri(request.getParameter("addressDom")) no meu servlet, Queria saber como que faço para não perder o valor que é atribuido a ele após dar o submit em meu formulário.

Ps.: Depois irei integrar à algum framework e separar lógica de negócio da lógico de apresentação. Estou fazendo dessa maneira porque preciso apresentar o quanto antes esse trabalho pra facul.
Obrigado pela atenção, abraço.

DaniloAndrade
jeovane.reges:
Na postagem resumir a classe OWLUtils. Resolvi o problema parcialmente, criei uma nova classe chamada OWLPages na qual o seu código encontra-se da seguinte maneira abaixo.
public class OWLPages {
    private String uri;

    public String getUri() {
        return uri;
    }

    public void setUri(String uri) {
        this.uri = uri;
    }
    
}
Meu servlet ficou da seguinte maneira abaixo.
protected void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        OWLPages pages = new OWLPages();
        pages.setUri(request.getParameter("addressDom"));
        
        OWLUtils utils = new OWLUtils(pages.getUri()); //se você quer que sua proxima pagina tenha esse "utils" pra vc usar vc deve coloca-lo no request 
        //exemplo:
        //request.setAtribute("utils " , utils ); dessa forma ele vai estar disponivel na proxima tela
        
        RequestDispatcher rd = request.getRequestDispatcher("/page-loaded-ontology.jsp");
        rd.forward(request, response);
}
No entanto, no momento que dou o meu submit acabo perdendo o valor do getUri() da minha classe OWLPages. Preciso dele, porque na minha página page-loaded-ontology.jsp faço novamente a chamada do construtor da classe OWLUtils. O código da minha página page-loaded-ontology.jsp encontra-se da seguinte maneira abaixo.
<div class="menuLeft">
    <h2>Classes</h2>
    <ul class="menuClasses">
         //scriptlet é uma má pratica evite sempre
        <%
            BuildsHierarchyDataProperty bhdp = new BuildsHierarchyDataProperty();
            String teste = "/home/jeovane/Dropbox/Public/Onto_DD.owl";
            OWLUtils ou = new OWLUtils(teste); // pra que vc esta instanciando novamente 

            ou.ontologyLoaded();

            for (Iterator it = bhdp.buildsHierarchy(ou.getOntology()).entrySet().iterator(); it.hasNext();) {
                Map.Entry entry = (Map.Entry) it.next();
                String key = ou.getPm().getShortForm((OWLEntity) entry.getKey()).replace(":", "");
                ArrayList<OWLEntity> arrayValues = (ArrayList<OWLEntity>) entry.getValue();
        %>
        <li>
            <a href="#" class="itemMenu" id="<%=key%>">+ <%=key%></a>
            <div class="conteudoMenu">
            <%
                for (OWLEntity owlEntity : arrayValues) {
                    String valueKey = ou.getPm().getShortForm(owlEntity).replace(":", "");
            %>
                <a href="#" id="<%=valueKey%>">- <%=valueKey%></a>
            <%
                }
            %>
            </div>
        </li>
        <%
            }
        %>
    </ul>
</div>
Como pode ver, a minha variável teste declaro explicitamente o valor que é armazenado em pages.setUri(request.getParameter("addressDom")) no meu servlet, Queria saber como que faço para não perder o valor que é atribuido a ele após dar o submit em meu formulário.

Ps.: Depois irei integrar à algum framework e separar lógica de negócio da lógico de apresentação. Estou fazendo dessa maneira porque preciso apresentar o quanto antes esse trabalho pra facul.
Obrigado pela atenção, abraço.

fiz uns comentários no seu código
e vou ser sincero, seu codigo ta meio bizarro

DaniloAndrade

so uma pergunta o que vc quer exibir exatamente nessa pagina page-loaded-ontology.jsp?

jeovane.reges

Olá DaniloAndrade, obrigado pelas ajudas :slight_smile:
Vamos lá.
Através do request consigo levar pra próxima página o valor do meu método OWLUtils, certo?

OWLUtils utils = new OWLUtils(pages.getUri()); request.setAttribute("utils", utils);
Como que faço para utiliza-lo na minha próxima página b[/b]?
Como você notou, na minha página page-loaded-ontology.jsp acabei instanciando novamente o mesmo método que havia instanciado no meu servlet. Vide código abaixo.

OWLUtils ou = new OWLUtils(teste); // pra que vc esta instanciando novamente

Instanciei-o novamente porque preciso chamar o meu método ontologyLoaded() que se encontra na minha classe OWLUtils.
Este método (ontologyLoaded()) é responsável por carregar o arquivo que é dado como entrada na minha página inicial (o servlet que tenho mostrado anteriormente é o que obtém esse valor).

Mas, caso eu consiga levar o valor de OWLUtils utils = new OWLUtils(pages.getUri()); para minha próxima página, então, bastará eu chama-lo utilizando o valor carregado pelo request.
Tentei fazer da seguinte maneira abaixo, no entanto, deu erro. Acredito que eu esteja fazendo errado.

BuildsHierarchyDataProperty bhdp = new BuildsHierarchyDataProperty(); utils.ontologyLoaded();
Então, como que faço para chamar meu método ontologyLoaded() utilizando o valor carregado pelo request?

A minha página inicial recebo como entrada o caminho de um arquivo .owl/xml, e através desse arquivo, manipulo-o e crio um menu dinâmico.
Por exemplo, a partir do código representado nesse link https://dl.dropbox.com/u/19076387/Onto_DD.owl consigo montar o menu da imagem abaixo.

DaniloAndrade

primeiro vamos melhorar isso aqui

for (Iterator it = bhdp.buildsHierarchy(ou.getOntology()).entrySet().iterator(); it.hasNext();) {  
                Map.Entry entry = (Map.Entry) it.next();  
                String key = ou.getPm().getShortForm((OWLEntity) entry.getKey()).replace(":", "");  
                ArrayList<OWLEntity> arrayValues = (ArrayList<OWLEntity>) entry.getValue();

vamos passar isso bhdp.buildsHierarchy(ou.getOntology()) pra dentro do seu servlet

protected void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {  
        OWLPages pages = new OWLPages();  
        pages.setUri(request.getParameter("addressDom"));  
          
        OWLUtils utils = new OWLUtils(pages.getUri()); //se você quer que sua proxima pagina tenha esse "utils" pra vc usar vc deve coloca-lo no request   
      
      //seguindo o que vc vez o codigo vai ficar assim
      utils.ontologyLoaded();
      BuildsHierarchyDataProperty bhdp = new BuildsHierarchyDataProperty();
      Map  mapaDeAlgumaCoisa = bhdp .buildsHierarchy(utils.getOntology());
     //ao em vez de mandar o utils vamos mandar o Mapa
    // assim
    request.setAtribute("mapaDeAlgumaCoisa" , mapaDeAlgumaCoisa );

  
          
        RequestDispatcher rd = request.getRequestDispatcher("/page-loaded-ontology.jsp");  
        rd.forward(request, response);  
}

na sua pagina vc vai fazer isso

primeiro vc deve adicionar ao seu jsp a core

<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>

ai voce vai usar a tag lib
c:forEach

<div class="menuLeft">  
    <h2>Classes</h2>  
<ul class="menuClasses">
<c:forEach var="item" items="${mapaDeAlgumaCoisa}">  
   
     <li>
         <a href="#" class="itemMenu" id="${item.key}">+ ${item.key}</a>
        <div class="conteudoMenu">
      <c:forEach var="subItem" items="${item.value}">
             // aqui vc faz resto por que eu não conheço o seu codigo muito bem
      </c:forEach >
         </div>// fim conteudoMenu
      </li> 
</c:forEach> 
</ul> // fim menuClasses
</div> // fim menuLeft

é mais ou menos isso, pode ter algum errinho por que to digitando direto no post

jeovane.reges

Após fazer umas pesquisas aqui conseguir pegar o valor de utils na página seguinte.

OWLUtils ou = (OWLUtils) request.getAttribute("utils");
DaniloAndrade

mas assim vc vai continuar usando scriptlet

jeovane.reges

Irei fazer aqui o que você disse.
Já já volto com novidades. :slight_smile:
Desde de já, muito obrigado pela ajuda.

jeovane.reges

Olá DaniloAndrade.
Ta quase 100% .. o código ficou bem mais limpo e amigável :)
Para que ele fique 100% é necessário que seja aplicado um tratamento nos valores.

Por exemplo, no menu da imagem (Figura 01) abaixo tem-se Disease como um dos itens do menu. No entanto, o seu valor original vindo do arquivo xml é http://www.owl-ontologies.com/Ontology1354213619.owl#Disease. Quando aplico o seguinte tratamento abaixo, então ele fica apenas como Disease.
// Este tratamento estar sendo na key do meu Map
utils.getPm().getShortForm((OWLEntity) entryBH.getKey()).replace(":", "");
Tentei fazer da seguinte forma abaixo, mas não deu certo.
// No servlet
OWLEntity treatment = null;
request.setAttribute("getPm", utils.getPm().getShortForm(treatment).replace(":", ""));

// Na minha página JSP
<c:out value="${getPm.item.key}"/>
Você tem ideia de como isso possa ser feito?

Figura 01
[img]https://dl.dropbox.com/u/19076387/menu-xml.png[/img]

DaniloAndrade

cria um metodo dentro do dessa classe OWLEntity que retornara o valor que vc precisa

por exemplo:

public String getDescricao(){
     return utils.getPm().getShortForm(this).replace(":", "")

}

no seu jsp vc vai escrever

<a href="#" class="itemMenu" id="${item.key.descricao}">+ ${item.key.descricao}</a>
jeovane.reges

OWLEntity é uma das classes da API na qual estou utilizando para manipular os arquivos owl, ou seja, não há como escrever o método nela.

Criei o método dentro da minha classe OWLUtils

public String getDescricao(){ return getPm().getShortForm((OWLEntity) this).replace(":", ""); }
No servlet, fiz da seguinte maneira

request.setAttribute("descricao", utils.getDescricao());

E no arquivo JSP fiz como você disse

<c:out value="${item.key.descricao}"/>

No entanto, deu o seguinte erro abaixo

java.lang.ClassCastException: example.ontologie.util.OWLUtils cannot be cast to org.semanticweb.owlapi.model.OWLEntity example.ontologie.util.OWLUtils.getDescricao(OWLUtils.java:96) example.ontologie.servlet.LoadsOntologiesServlet.service(LoadsOntologiesServlet.java:53) javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

jeovane.reges
Conseguir dar certo fazendo o tratamento direto no proprio servlet. Onde percorri os valores do meu método buildsHierarchy() e fui aplicando nele o tratamento diretamente e adicionando esses valores tratados em novo map. Sendo assim, ficou da seguinte forma abaixo o meio que utilizei.
Map<Object, ArrayList<OWLEntity>> mapOntology = bhdp.buildsHierarchy(utils.getOntology());        
Map<String, ArrayList<String>> mapClass = new TreeMap<String, ArrayList<String>>();
ArrayList<String> values;

for (Iterator itBH = mapOntology.entrySet().iterator(); itBH.hasNext();) {
    Map.Entry entryBH = (Map.Entry) itBH.next();
    String key = utils.getPm().getShortForm((OWLEntity) entryBH.getKey()).replace(":", "");
    ArrayList<OWLEntity> arrayValues = (ArrayList<OWLEntity>) entryBH.getValue();
    values = new ArrayList<String>();
    for (OWLEntity owlEntity : arrayValues) {
        String valueKey = utils.getPm().getShortForm(owlEntity).replace(":", "");
        values.add(valueKey);
    }
    mapClass.put(key, values);
}

 request.setAttribute("mapClass", mapClass);
DaniloAndrade

Eh meu amigo , agora complicou, mas isso que vc ta fazendo nao funciona , uma alternativo eh encapsular esse codigo de tratamento dentro de uma taglib personalizada ou vc recriar o conteudo desse map dentro de sua servlet com uma classe sua, mas isso pode custar um pouco em desempenho

DaniloAndrade

Vc fez o que eu estava respondendo, eh isso ai , mas isso vai custa um pouco o desempenho

DaniloAndrade

So uma pergunta , quanto tempo vc programa pra web com.java ?

jeovane.reges

Acaba ficando com custo n², mas sinceramente depois dos toques que você deu o código ficou muito mais legível :smiley:

Tem pouco tempo que programo em java pra web, acho que tem uns 2 ou 3 meses, sempre tive maior afinidade com php.
No entanto, os recursos de OO pra php é ainda estão muito tímidos frente aos recursos proporcionado por java.
Aí estou nesse mundo recentemente. Porém estou gostando :slight_smile:

Você por sinal já tem um bom tempo né? Quanto tempo ta nesse mundo já? :slight_smile:

DaniloAndrade

Uns dois anos e meio
Vou te dar uma dica , da uma lida na apostila da caelum a fj 21 ela ta disponível pra download , vai te ajudar a pegar os fundamentos

DaniloAndrade

Agora vou dormi velhinho , boa noite , e boa sorte na Apresentação do trabalho

jeovane.reges

Quanto tempo em… :smiley:
Queria eu já ter toda essa experiencia,
Irei dar uma olhada nela depois :slight_smile:
Mais uma vez, obrigadão pela Dicas DaniloAndrade :smiley:
Espero que em outras dúvidas que eu venha postar você esteja por perto Hehe
Boa noite até a próxima, abraço.

DaniloAndrade

Por nada , estamos ai pra se ajudar

Criado 18 de janeiro de 2013
Ultima resposta 19 de jan. de 2013
Respostas 30
Participantes 3