0 votes

Pourquoi la méthode addBirth renvoie-t-elle un résultat nul ?

J'ai cette méthode mais au moment de l'exécution, une exception nullpointerexception est levée, pourquoi ?

ma méthode :

public static boolean isAddBirth(String name, String family, String fatherName, String mName, String dOfBirth, String pOfBirth) {
    ResultSet rst;
    boolean bool = false;
    Statement stmt;
    try {
        stmt = conn.createStatement();

        rst = stmt.executeQuery("SELECT * FROM birthtable");

        while (rst.next()) {
            if (rst.getString(2).equals(name) && rst.getString(3).equals(family) && rst.getString(4).equals(fatherName) && rst.getString(5).equals(mName) && rst.getString(6).equals(dOfBirth) && rst.getString(7).equals(pOfBirth)) {
                bool = false;
            } else {
                bool = true;
            }
        }
    } catch (SQLException ex) {
        Logger.getLogger(Manager.class.getName()).log(Level.SEVERE, null, ex);
    }
    return bool;

}

stacktrace :

java.lang.NullPointerException
    at database.Manager.isAddBirth(Manager.java:164)
    at AdminGUI.AddNewBornInformation.submit(AddNewBornInformation.java:356)
    at AdminGUI.AddNewBornInformation.setButtonActionPerformed(AddNewBornInformation.java:283)
    at AdminGUI.AddNewBornInformation.access$800(AddNewBornInformation.java:28)
    at AdminGUI.AddNewBornInformation$9.actionPerformed(AddNewBornInformation.java:140)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
    at java.awt.Component.processMouseEvent(Component.java:6038)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
    at java.awt.Component.processEvent(Component.java:5803)
    at java.awt.Container.processEvent(Container.java:2058)
    at java.awt.Component.dispatchEventImpl(Component.java:4410)
    at java.awt.Container.dispatchEventImpl(Container.java:2116)
    at java.awt.Component.dispatchEvent(Component.java:4240)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)
    at java.awt.Container.dispatchEventImpl(Container.java:2102)
    at java.awt.Window.dispatchEventImpl(Window.java:2429)
    at java.awt.Component.dispatchEvent(Component.java:4240)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)

AUSSI ceux-là sont dans ma classe :

Logger logger = Logger.getLogger(this.getClass().getName());
private static Connection conn = DBManager.getConnection();

2voto

Anon. Points 26829

Tout d'abord, même si ça marchait, ce code ne ferait pas ce que vous voulez. Pas même proche.

Deuxièmement, il serait utile de savoir sur quelle ligne se trouve l'exception. Au lieu de cela, nous pouvons la réduire à l'un des cas suivants :

  1. conn est nulle.
  2. conn.createStatement(); renvoie un résultat nul.
  3. stmt.executeQuery() renvoie un résultat nul.
  4. L'un des rst.getString() s renvoie la nullité.

Je suis sûr que vous pouvez le découvrir à partir de là.

2voto

TofuBeer Points 32441

Comme vous n'avez pas donné le numéro de ligne 164, je suppose que c'est le cas :

if (rst.getString(2).equals(name) && rst.getString(3).equals(family) && rst.getString(4).equals(fatherName) && rst.getString(5).equals(mName) && rst.getString(6).equals(dOfBirth) && rst.getString(7).equals(pOfBirth))

D'abord, cette phrase me donne envie de pleurer.

Réparons-le :

String a;
String b;
String c;
String d;
String e;
String f;

a = rst.getString(2);
b = rst.getString(3);
c = rst.getString(4);
d = rst.getString(5);
e = rst.getString(6);
f = rst.getString(7);

if (!(a.equals(name))
{
    bool = false;
}

if(!(b.equals(family))
{
    bool = false;
}

if(!(c.equals(fatherName))
{
    bool = false;
}

if(!(d.equals(mName))
{
    bool = false;
}

if(!(e.equals(dOfBirth))
{
    bool = false;
}

if(!(f.equals(pOfBirth))
{
    bool = false;
}

Cela vous montrera au moins la ligne sur laquelle se trouve le pointeur nul (en supposant que ma supposition est correcte).

Aussi, a-e sont des noms terribles... tu devrais en choisir de meilleurs que moi.

La vraie solution ici est d'utiliser la programmation orientée objet telle qu'elle est prévue... créons une classe Personne :

public class Person
{
    private final String firstName;
    private final String lastName;
    private final String middleName; // guessing that is what mName is...
    private final String fathersName;
    private final String dateOfBirth;
    private final String placeOfBirth; // guessing that is what pOfBirth is...

    public Person(final String firstName,
                  final String lastName,
                  final String middleName,
                  final String fathersName,
                  final String dateOfBirth,
                  final String placeOfBirth)
    {
        if(firstName == null)
        {
            throw new IllegalArgumentException("firstName cannot be null");
        }

        if(lastName == null)
        {
            throw new IllegalArgumentException("lastName cannot be null");
        }

        ... etc for all of the other arguments ...

        // I would never do the this.fristName thing.. .I would name the parameter different than the instance vairable...
        this.firstName = firstName;
        this.lastName  = lastName;

        ... etc for all of the other arguments ... 
    }

    public boolean equals(final Object o)
    {
        final Person person;

        if(!(o instanceof Person))
        {
            return (false);
        }

        other = (Person)o;

        // the code you I put above + your code for checking if they are equal
    }

    public int hashCode()
    {
        // this is probably good enough
        return (firstName.hashCode() + lastName.hashCode());
    }
}

Ensuite, dans votre méthode, vous auriez un code du type :

rst = stmt.executeQuery("SELECT * FROM birthtable");

    while (rst.next()) 
    {
        final Person person;

        // I would use temp variables rather than passing in the result of getString directly...
        person = new Person(rst.getString(2),
                            rst.getString(3),
                            rst.getString(4),
                            rst.getString(5),
                            rst.getString(6),
                            rst.getString(7));

        // otherPerson would be passed into the method instead of the String you are passing now
        bool = person.equals(otherPerson);

        ... etc ...
    }

1voto

sateesh Points 7967

Je pense que la cause probable est que la méthode "getString" renvoie null.
La documentation API de cette méthode indique qu'elle peut retourner null.

String getString(int columnIndex) [...]

Retourne : la valeur de la colonne ; si la valeur est SQL NULL, la valeur retournée est null

La référence de la documentation API ci-dessus provient de : ResultSet

0voto

Ravi Wallau Points 5012

Pour que votre programme soit moins sujet aux NullPointerExceptions, vous pourriez supposez que vos variables d'entrée ne sont pas nulles (ou garantir que dans le début de votre méthode), et inverser la comparaison :

if (name.equals(rst.getString(1)) && ...

L'autre alternative, avec laquelle je n'ai aucun problème, est d'utiliser la méthode ObjectUtils.equals(obj1, obj2) de la bibliothèque commons-lang, elle ne retournera vrai que si les deux objets sont nuls ou si obj1.equals(obj2), toute autre possibilité retournera faux. Les classes ObjectUtils et StringUtils possèdent de nombreuses méthodes à sécurité nulle, cela vaut la peine d'y jeter un œil.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X