Java.lang.NullPointerException

Estou com um problema quando vou adicionar um novo produto, ao chamar o addProduct.jsp estou tendo esse erro:

[quote]javax.faces.el.EvaluationException: java.lang.NullPointerException
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:102)
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
at javax.faces.component.UICommand.broadcast(UICommand.java:315)
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:775)
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1267)
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:82)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:312)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1852)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
Caused by: java.lang.NullPointerException
at myfirstjsfapp.dao.ProductDAO.add(ProductDAO.java:30)
at myfirstjsfapp.managedbeans.ProductFace.finishAddProduct(ProductFace.java:36)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.el.parser.AstValue.invoke(AstValue.java:278)
at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:274)
at org.apache.jasper.el.JspMethodExpression.invoke(JspMethodExpression.java:70)
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
… 24 more[/quote]

Esse é o meu ProductDAO.java

[code]/*

  • To change this template, choose Tools | Templates
  • and open the template in the editor.
    */

package myfirstjsfapp.dao;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.List;
import myfirstjsfapp.db.DatabaseUtil;
import myfirstjsfapp.db.Product;

/**
*

  • @author Robinho
    */
    public class ProductDAO extends DatabaseUtil{

    private static final long serialVersionUID = 1L;

    public ProductDAO(){
    super();
    }

    public boolean add(Product prod) throws ClassNotFoundException, SQLException{
    PreparedStatement ps = (PreparedStatement) getPreparedStatement(“INSERT INTO APP.PRODUCT values (?,?,?,?)”);
    ps.setInt(1, prod.getCode());
    ps.setString(2, prod.getName());
    ps.setInt(3, prod.getNumberofitens());
    ps.setDouble(4, prod.getPrice());
    int toReturn = ps.executeUpdate();
    ps.close();
    return toReturn > 0;
    }

    public boolean set(Product prod) throws ClassNotFoundException, SQLException{
    PreparedStatement ps = (PreparedStatement) getPreparedStatement(“UPDATE APP.PRODUCT SET NAME = ?, NUMBEROFITENS = ?, PRICE = ? WHERE CODE = ?”);
    ps.setString(1, prod.getName());
    ps.setInt(2, prod.getNumberofitens());
    ps.setDouble(3, prod.getPrice());
    ps.setInt(4, prod.getCode());
    int toReturn = ps.executeUpdate();
    ps.close();
    return toReturn > 0;
    }

    public boolean delete(Product prod) throws SQLException, ClassNotFoundException{
    PreparedStatement ps = (PreparedStatement) getPreparedStatement("DELETE FROM APP.PRODUCT WHERE CODE = ? ");
    ps.setInt(1, prod.getCode());
    int toReturn = ps.executeUpdate();
    ps.close();
    return toReturn > 0;
    }

    public ListgetAllProducts() throws ClassNotFoundException, ClassNotFoundException, SQLException{
    List toReturn = new LinkedList();
    ResultSet rs = getStatement().executeQuery(“SELECT * FROM APP.PRODUCT”);
    while (rs.next()){
    Product prod = new Product();
    populateProd(prod,rs);
    toReturn.add(prod);
    }
    rs.close();
    return toReturn;
    }

    public Product getById(int iProduct) throws ClassNotFoundException, SQLException{
    PreparedStatement ps = (PreparedStatement) getPreparedStatement("SELECT * FROM APP.PRODUCT WHERE CODE = ? ");
    ps.setInt(1, iProduct);
    ResultSet rs = ps.executeQuery();
    if (!rs.next()) return null;
    Product toReturn = new Product();
    populateProd(toReturn, rs);
    rs.close();
    ps.close();
    return toReturn;

    }

    private void populateProd(Product prod, ResultSet rs) throws SQLException {
    prod.setCode(rs.getInt(“CODE”));
    prod.setName(rs.getString(“NAME”));
    prod.setNumberofitens(rs.getInt(“NUMBEROFITENS”));
    prod.setPrice(rs.getDouble(“PRICE”));
    }
    }
    [/code]

Esse é o meu ManagedBean (ProductFace.java):

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package myfirstjsfapp.managedbeans;

import java.sql.SQLException;
import java.util.List;
import myfirstjsfapp.dao.ProductDAO;
import myfirstjsfapp.db.Product;


/**
 *
 * @author Robinho
 */
public class ProductFace {

    private ProductDAO prodDAO = new ProductDAO();
    private Product selectedProduct;
    private List<Product> products;
    

    /** Creates a new instance of ProductFace */
    public ProductFace() {
        System.out.println("The product face has created !");
    }
    
    public String startAddProduct(){
        selectedProduct = new Product();
        return "gotoAddNewProduct";
    }
    
    public String finishAddProduct() throws ClassNotFoundException, SQLException{
        prodDAO.add(selectedProduct);
        //Clean the Cached Products
        products = null;
        return "gotoListProducts";                
    }
    
    public List<Product> getProducts() throws ClassNotFoundException, SQLException{
        if (products == null){
            products = prodDAO.getAllProducts();
        }        
        return products;
    }
    
    public String startEditProduct(){
       return "gotoEditProduct";
    }
    
    public String finishEditProduct()  throws ClassNotFoundException, SQLException{
        prodDAO.set(selectedProduct);
        //Clean the Cached Products
        products = null;
        return "gotoListProducts";                
    }

    public String removeProduct()  throws ClassNotFoundException, SQLException{
        prodDAO.delete(selectedProduct);
        products = null;
        return "gotoListProducts";
    }

    public Product getSelectedProduct() {
        return selectedProduct;
    }

    public void setSelectedProduct(Product selectedProduct) {
        this.selectedProduct = selectedProduct;
    }
}

e esse é o meu products.jsp

<%-- 
    Document   : products
    Created on : 31/07/2013, 23:13:20
    Author     : Robinho
--%>

<%@page contentType="text/html" pageEncoding="UTF-8"%>

<%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%>

<!doctype html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>The Products</title>
    </head>
    <body>
        <f:view>
            <h:form>
            <h1><h:outputText value="The Products"/></h1>
            <h:dataTable border="1" var="item" value="#{productFace.products}">
                <h:column>
                    <f:facet name="header">
                        <h:outputText value="code"/>
                    </f:facet>
                    <h:outputText value="#{item.code}"/>
                </h:column>
                <h:column>
                    <f:facet name="header">
                        <h:outputText value="Name"/>
                    </f:facet>
                    <h:outputText value="#{item.name}"/>
                </h:column>
                <h:column>
                    <f:facet name="header">
                        <h:outputText value="Stock"/>
                    </f:facet>
                    <h:outputText value="#{item.numberofitens}"/>
                </h:column>
                <h:column>
                    <f:facet name="header">
                        <h:outputText value="Price"/>
                    </f:facet>
                    <h:outputText value="#{item.price}"/>
                </h:column>
                <h:column>
                    <f:facet name="header">
                        <h:outputText value="Actions"/>
                    </f:facet>
                    <h:commandLink value="delete" action="#{productFace.removeProduct}">
                        <f:setPropertyActionListener target="#{productFace.selectedProduct}" value="#{item}"/>
                    </h:commandLink> 
                    <h:outputText value="/"/>
                    <h:commandLink value="edit" action="#{productFace.startEditProduct}">
                        <f:setPropertyActionListener target="#{productFace.selectedProduct}" value="#{item}"/>
                    </h:commandLink> 
                </h:column>
            </h:dataTable>

            <br/>

            [b]<h:commandButton action="#{productFace.finishAddProduct}" value="Add new Product" />[/b]
            </h:form>
        </f:view>
    </body>
</html>

Acima que está o Button que clico e ai aparece o erro…

esse é o meu faces-config.xml

[code]<?xml version='1.0' encoding='UTF-8'?>



productFace
myfirstjsfapp.managedbeans.ProductFace
session


salesFace
myfirstjsfapp.managedbeans.SalesFace
session


/welcomeJSF.jsp

gotoListProducts
/products.jsp



/products.jsp

gotoListProducts
/products.jsp


gotoAddNewProduct
/addProduct.jsp



/addProduct.jsp

gotoListProducts
/products.jsp



[/code]

NullPointerException é uma exceção que diz: Você, programador, esqueceu de instanciar algum objeto e está tentando acessar algo dentro dele.
A mensagem deve ser lida até que você encontre onde cometeu a “cagada”.
Eu facilitei isso pra ti:

at myfirstjsfapp.dao.ProductDAO.add(ProductDAO.java:30) 

realmente não estou conseguindo ver onde eu fiz a “cagada” rs…pois na classe de test funcionou certinho…

me ajuda ai…

[quote=robinhodemorais]realmente não estou conseguindo ver onde eu fiz a “cagada” rs…pois na classe de test funcionou certinho…

me ajuda ai…[/quote]
Minha bola de cristal não está funcionando.
Talvez se você depurar, consiga ver algo que ela não me mostra.

Já passei por isso e resolvi colocando o code ou id como Integer em vez de int.Já tentou isso?

ps.setInt(1, prod.getCode());  

Outra coisa é que o products.jsp que vc postou é para exibir os produtos cadastrados, o erro é nessa página mesmo ou no addProducts?
veja também se vc está chamando o endereço correto dos atributos usando o ProductFace.selectedProduto.nomedoproduto ok?

as vezes este tipo de erro passa despercebido!!

Espero ter ajudado!

Em algum momento você está tentando acessar um comportamento de um objeto que não foi instanciado…

Ex:

se fizer isso

Moveis cadeira; cadeira.getPes();
vai dar nullpointer, pois vc não atribuiu um objeto (esse é um dos muitos exemplos)

agora se fizer

Moveis cadeira = new Moveis(); cadeira.getPes;

aí vai rodar certinho…

espero ter ajudado…