代码如下:import java.sql.*;
public class demo1 {
//连接数据库
 public static void getDatabase(Connection con) throws ClassNotFoundException, SQLException{
  Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
  DriverManager.registerDriver(new com.microsoft.sqlserver.jdbc.SQLServerDriver());
  String url="jdbc:sqlserver://localhost:1433;DatabaseName=EMP";
  con=DriverManager.getConnection(url, "sa", "123456");
 } public static Statement getStmt(Connection con) throws SQLException{
  return con.createStatement();
 } public static ResultSet getRrs(Statement stmt,String sql) throws SQLException{
  return stmt.executeQuery(sql);
 } public static void show(ResultSet rrs) throws SQLException{
  while(rrs.next()){
   System.out.println(rrs.getInt("stuID")+"\t"+rrs.getString("stuName")+"\t"+
     rrs.getString("stuJob")+"\t"+rrs.getString(4));
  }
 }
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  Connection con = null;
  Statement stmt = null;
  ResultSet rrs = null;
  try{
   System.out.println("正在连接数据库.....");
   //连接数据库
   getDatabase(con);
   System.out.println("连接数据库成功");
   
   stmt=getStmt(con);
   String sql="select stuID,stuName,stuJob,stuAdd from student";
   rrs=getRrs(stmt,sql);
   
   show(rrs);
   
  }catch (ClassNotFoundException e) {
   System.out.println(e.getMessage());
  } catch (SQLException e) {
   System.out.println(e.getMessage());
  }finally{
   try{
    if(rrs!=null){
     rrs.close();
     rrs = null;
    }
    if(stmt!=null){
     stmt.close();
     stmt = null;
    }if(con!=null){
     con.close();
     con = null;
    }
   }catch(SQLException e){
    e.printStackTrace();
   }
  }
 }}
出现异常:正在连接数据库.....
连接数据库成功
Exception in thread "main" java.lang.NullPointerException
 at demo1.getStmt(demo1.java:10)
 at demo1.main(demo1.java:32)
就是我加粗的两句出现的异常!我才学这个!不知道怎么解决,.NullPointerException是空指针异常类 但是con不是null啊!请教高手指教!

解决方案 »

  1.   

    con不是null吗?在con.createStatement()前面加一句System.out.println(null==con);看看输出结果.
      

  2.   

    public static void main(String[] args) {
      // TODO Auto-generated method stub
      Connection con = null;
      Statement stmt = null;
      ResultSet rrs = null;
      try{
      System.out.println("正在连接数据库.....");
      //连接数据库
      getDatabase(con);//做完这个事情后,con还是null,
    将getDatabase修改一下:public static Connection getDatabase() throws ClassNotFoundException, SQLException{
      Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
      DriverManager.registerDriver(new com.microsoft.sqlserver.jdbc.SQLServerDriver());
      String url="jdbc:sqlserver://localhost:1433;DatabaseName=EMP";
      Connection con=DriverManager.getConnection(url, "sa", "123456");
      return con;
     }
    main方法:
    public static void main(String[] args) {
      // TODO Auto-generated method stub
      Connection con = null;
      Statement stmt = null;
      ResultSet rrs = null;
      try{
      System.out.println("正在连接数据库.....");
      //连接数据库
      con = getDatabase(con);
    ...
      

  3.   

    at demo1.getStmt(demo1.java:10)
     at demo1.main(demo1.java:32)
    这两行的代码是什么?贴出来看看。或者是加个断点跟踪看看。
      

  4.   


    谢谢!
    问题解决了!
    调用getDatabase()方法的时候包con=null传进去了不过传过来的con(实参:调用处的变量,此时指向堆上地址:null)到了方法中,已经是另外一个栈上面的的地址了(形参:方法中的局部变量,此时指向堆上地址:null)在方法中形参的引用地址被改变了 con=DriverManager.getConnection(url, "sa", "123456");
    而实参的引用地址未被改变 ,依然是null值