[英]Why is addBirth method returns null?
我有此方法,但在運行時會拋出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();
首先,即使它起作用了,該代碼也無法實現您想要的功能。 差遠了。
第二,如果我們知道異常所在的行,這將有所幫助。 不過,我們可以將其縮小為以下之一:
conn
為空。 conn.createStatement();
返回null。 stmt.executeQuery()
返回null。 rst.getString()
返回null。 我相信您可以從那里弄清楚。
鑒於您沒有提供第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是個糟糕的名字……您應該選擇比我更好的名字。
真正的解決方案是按預期使用面向對象的編程……讓我們創建一個Person類:
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 ...
}
我認為可能的原因是“ getString”方法返回null。
此方法的API文檔指示它可以返回null。
字符串getString(int columnIndex)[...]
返回:列值; 如果值為SQL NULL,則返回的值為null
上面的API文檔參考來自: ResultSet
為了使程序不太容易出現NullPointerExceptions,可以假定輸入變量不為null(或確保在方法的開頭),然后將比較結果取反:
if (name.equals(rst.getString(1)) && ...
我沒有任何問題的另一種選擇是使用commons-lang庫中的ObjectUtils.equals(obj1,obj2)方法,僅當兩個對象均為null或obj1.equals( obj2),所有其他可能性都將返回false。 ObjectUtils和StringUtils類具有許多空安全的方法,值得一看。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.