我无法解决这个“NullPointerException”
Posted
技术标签:
【中文标题】我无法解决这个“NullPointerException”【英文标题】:I can not solve this "NullPointerException" 【发布时间】:2012-08-01 09:47:19 【问题描述】:我正在尝试使用 swing 事件处理来访问数据库表记录,但在按下按钮后它显示异常。我不知道出了什么问题。这是我的代码:
private void DisplayAllButtonActionPerformed(java.awt.event.Act ionEvent evt)
try
String SQL = "SELECT * FROM OCCUPANTS";
rs = stmt.executeQuery( SQL ); //line no 264
while( rs.next( ))
int id_col = rs.getInt("ID");
String id=Integer.toString(id_col);
String room =rs.getString("ROOM");
String occupant = rs.getString("OCCUPANT");
DisplayArea.setText( id + " " + room + " " + occupant);
catch ( SQLException err )
System.out.println( err.getMessage( ) );
休闲是例外:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at wumpus.WumpusGUI.DisplayAllButtonActionPerformed(W umpusGUI.java:264)
at wumpus.WumpusGUI.access$300(WumpusGUI.java:16)
at wumpus.WumpusGUI$4.actionPerformed(WumpusGUI.java: 164)
at javax.swing.AbstractButton.fireActionPerformed(Abs tractButton.java:2018)
at javax.swing.AbstractButton$Handler.actionPerformed (AbstractButton.java:2341)
at javax.swing.DefaultButtonModel.fireActionPerformed (DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultB uttonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseRe leased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.jav a:6505)
at javax.swing.JComponent.processMouseEvent(JComponen t.java:3321)
at java.awt.Component.processEvent(Component.java:627 0)
at java.awt.Container.processEvent(Container.java:222 9)
at java.awt.Component.dispatchEventImpl(Component.jav a:4861)
at java.awt.Container.dispatchEventImpl(Container.jav a:2287)
at java.awt.Component.dispatchEvent(Component.java:46 87)
at java.awt.LightweightDispatcher.retargetMouseEvent( Container.java:4832)
at java.awt.LightweightDispatcher.processMouseEvent(C ontainer.java:4492)
at java.awt.LightweightDispatcher.dispatchEvent(Conta iner.java:4422)
at java.awt.Container.dispatchEventImpl(Container.jav a:2273)
at java.awt.Window.dispatchEventImpl(Window.java:2719 )
at java.awt.Component.dispatchEvent(Component.java:46 87)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.j ava:703)
at java.awt.EventQueue.access$000(EventQueue.java:102 )
at java.awt.EventQueue$3.run(EventQueue.java:662)
at java.awt.EventQueue$3.run(EventQueue.java:660)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPri vilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPri vilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:676)
at java.awt.EventQueue$4.run(EventQueue.java:674)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPri vilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java: 673)
at java.awt.EventDispatchThread.pumpOneEventForFilter s(EventDispatchThread.java:244)
at java.awt.EventDispatchThread.pumpEventsForFilter(E ventDispatchThread.java:163)
at java.awt.EventDispatchThread.pumpEventsForHierarch y(EventDispatchThread.java:151)
at java.awt.EventDispatchThread.pumpEvents(EventDispa tchThread.java:147)
at java.awt.EventDispatchThread.pumpEvents(EventDispa tchThread.java:139)
at java.awt.EventDispatchThread.run(EventDispatchThre ad.java:97)
BUILD SUCCESSFUL (total time: 28 seconds)
这里是stmt
的全局初始化
public class WumpusGUI extends javax.swing.JFrame
Connection con;
Statement stmt;
ResultSet rs;
/**
* Creates new form WumpusGUI
*/
public WumpusGUI()
initComponents();
DBConnect();
public void DBConnect()
try
String host = "jdbc:derby://localhost:1527/occupants";
String uName = "ravi";
String uPass= "ravi";
Connection con = DriverManager.getConnection( host, uName, uPass );
Statement stmt = con.createStatement();
catch (Exception e)
e.printStackTrace();
谢谢。
【问题讨论】:
什么是“stmt”,在哪里声明/初始化? 你能在 WumpusGUI.java 中显示第 264 行吗 @Nirmal-thInkbeYond- 我在评论中提到的第 4 行的第一个代码。 【参考方案1】:好吧,您还没有显示stmt
的声明位置,但听起来它可能为空。您在哪里期望将其设置为非空值?
关于这个的两点:
您应该在每次执行查询时使用单独的PreparedStatement
您不应该在 UI 线程中执行数据库访问
(此外,您的方法名称违反了 Java 命名约定。)
编辑:从您的 cmets 中,您得到:
public class WumpusGUI ...
Statement stmt;
public void DBConnect()
...
Statement stmt = con.createStatement();
...
你方法的那一行声明了一个新的 local 变量——它没有为 instance 变量赋值,所以实例变量保持为空。
最小的“修复”是将该行更改为:
stmt = con.createStatement();
...但正如我上面所说,这不是 正确的 解决方法。理想情况下,您应该从 GUI 类中获取所有此数据库代码,但至少您应该在每次要执行它时创建一个新语句。 (然后在 finally 块中关闭它。)
编辑:此外,如果您在方法中遇到异常,您只是将其打印出来并继续愉快地......所以您的stmt
变量将仍然为空。 一般情况下不要捕获Exception
,并且不要捕获您之后真的无法继续的异常。
【讨论】:
我已经全局声明了 'stmt': 'public class WumpusGUI extends javax.swing.JFrame Connection con;语句 stmt;结果集rs; /** * 创建新表单 WumpusGUI */ public WumpusGUI() initComponents();数据库连接(); public void DBConnect() try String host = "jdbc:derby://localhost:1527/occupants";字符串 uName = "ravi";字符串uPass =“拉维”; Connection con = DriverManager.getConnection(host, uName, uPass);语句 stmt = con.createStatement(); ' @raviahuja 请不要在 cmets 中发布代码。编辑您的问题并添加此代码。 @jon :我已经编辑了代码,请看一下。谢谢 @raviahuja:我已经编辑了我的答案 - 我误认为它在构造函数中,但你在你的(名字不好的)DBConnect
方法中遇到了同样的问题。跨度>
@jon: 我现在改了这个名字,但还是一样的问题【参考方案2】:
很简单:stmt
尚未初始化。
【讨论】:
【参考方案3】:您的 stamt 变量可能已全局初始化为 null,但您可能无法分配必须从连接中获取的值。检查您的代码。
【讨论】:
【参考方案4】:在使用它之前,您必须调用 DBConnect 方法来初始化 stmt 变量。
【讨论】:
以上是关于我无法解决这个“NullPointerException”的主要内容,如果未能解决你的问题,请参考以下文章
Maven打包时出现“Show Console View”错误弹出框,错误详情为“An internal error has occurred. java.lang.NullPointerExcept
Maven打包时出现“Show Console View”错误弹出框,错误详情为“An internal error has occurred. java.lang.NullPointerExcept
Spring JUnit 测试使用 TestContext.retrieveContextLoaderClass(TestContext .java:197) 获取 NullPointerExcept