سؤال

لدي هذه الطريقة ولكن في وقت التشغيل، سيتم إلقاؤها nullpointerexception، لماذا؟

طريقةي:

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;




}

تتبع المكدس:

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)

أيضا هذه في صفي:

Logger logger = Logger.getLogger(this.getClass().getName());
private static Connection conn = DBManager.getConnection();
هل كانت مفيدة؟

المحلول

نظرا لأنك لم تقدم رقم الخط 164، فسأخذ تخمين أنه:

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)) 

أولا قبالة هذا الخط يجعلني أرغب في البكاء.

دعونا إصلاحه:

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;
}

سوف تظهر لك ذلك على الأقل أن الخط الذي يحتوي على مؤشر فارغ عليه (على افتراض تخميني صحيحا).

أيضا، AE أسماء فظيعة ... يجب أن تختار أفضل منها مما فعلت.

الحل الحقيقي هنا هو استخدام البرمجة الموجهة للكائنات كما هو المقصود ... دعونا نجعل فئة الشخص:

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());
    }
}

ثم في طريقتك سيكون لديك رمز مثل:

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 ...
    }

نصائح أخرى

بادئ ذي بدء، حتى لو كان يعمل، فإن هذا الرمز لن يفعل ما تريده. ليس حتى قريب.

ثانيا، سيساعد ذلك إذا عرفنا ما هو السطر الذي كان الاستثناء. بدلا من ذلك، يمكننا تضييقها على أحد الإجراءات التالية:

  1. conn باطل.
  2. conn.createStatement(); إرجاع null.
  3. stmt.executeQuery() إرجاع null.
  4. واحدة من rst.getString()S إرجاع null.

أنا متأكد من أنه يمكنك معرفة ذلك من هناك.

أعتقد أن السبب المحتمل هو أن طريقة "GetString" هي إرجاع NULL.
يشير وثائق API لهذه الطريقة إلى أنه يمكن أن يعود فارغة.

سلسلة GetString (Int Collemindex) [...

إرجاع: قيمة الأعمدة؛ إذا كانت القيمة هي SQL NULL، فستكون القيمة التي تم إرجاعها باطل

مرجع الوثيقة API أعلاه هو من:مجموعة النتائج

بالنسبة لبرنامجك ليكون أقل عرضة ل NullPointerExceptions، يمكنك تولى القيام أن متغيرات المدخلات الخاصة بك ليست فارغة (أو يضمن أنه في بداية طريقتك)، وانعكس المقارنات:

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

البديل الآخر، الذي ليس لدي أي مشاكل معه، هو استخدام Objectutil طريقة الطريقة. المساواة (OBJ1، OBJ2) من مكتبة العموم اللانج، سيعود صحيح فقط إذا كانت كلا الكائنتين فارغة أو إذا obj1. OBJ2)، كل الاحتمالات الأخرى سوف يعود خطأ. يتمتع Acesutils و Strututils بالكثير من الطرق التي تكون آمنة غير مهمة، فهي تستحق إلقاء نظرة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top