java代码出现空指针,到底那里错了呀?

img

img

img

package PetShop.util;



import java.lang.reflect.Field;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

public abstract class DBUtil<T>{
    private Connection conn=null;
    private PreparedStatement pst=null;
    private ResultSet rs=null;
    private Properties pro=new Properties();
    //1.统一连接方法 需要上面那一串
    public Connection getConn(){
        try {
            pro.load(this.getClass().getClassLoader().getResourceAsStream("db.properties"));
            Class.forName(pro.getProperty("driver"));
            conn= DriverManager.getConnection(pro.getProperty("url"),pro.getProperty("uname"),pro.getProperty("password"));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return conn;
    }
    //2.统一关闭方法
    public void getClose(ResultSet rs,PreparedStatement pst,Connection conn){
        try {
            if (rs!=null){
             rs.close();
            }if (pst!=null){
                pst.close();
            }if(conn!=null){
                conn.close();
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    //3.统一更新方法 增删改返回的都是受影响行数
    public boolean update(String sql,Object...obj){
        try {
            pst=getConn().prepareStatement(sql);
            //为占位符赋值
            for (int i = 0; i < obj.length; i++) {
                pst.setObject(i+1,obj[i]);
            }
            //执行sql
            int row=pst.executeUpdate();
            if (row>0){
                return true;
            }
        }catch (Exception e){
                e.printStackTrace();
        }
        return false;
    }
    //4.统一查询方法
    public List<T> query(String sql,Object...obj){
        List<T>list=new ArrayList<>();
        try {
            pst=getConn().prepareStatement(sql);
            //为占位符赋值
            for (int i = 0; i < obj.length; i++) {
                pst.setObject(i+1,obj[i]);
            }
            //执行sql
            rs=pst.executeQuery();
            //获取结果集的数据源结构
            ResultSetMetaData rsmd=rs.getMetaData();
            //获取到表名,得到类
            String tableName=rsmd.getTableName(1);
            Class Clazz=Class.forName("PetShop/bean."+tableName.substring(0,1).toUpperCase()+tableName.substring(1));
            //获取到字段的个数
            int cnum=rsmd.getColumnCount();
            while (rs.next()){
                //创建对象 不要去检查的警告,解决警告
                @SuppressWarnings("unchecked")
                T t= (T) Clazz.newInstance();
                //循环字段
                for (int i = 0; i < cnum; i++) {
                    //循环字段并获取到字段名称
                    String cname=rsmd.getColumnName(i+1);
                    //通过字段名获取到属性
                    Field f= Clazz.getDeclaredField(cname);
                    //打开权限
                    f.setAccessible(true);
                    //为每个属性赋值
                    f.set(t,rs.getObject(i+1));
                }
                //再将对象放入集合
                list.add(t);
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return list;
    }
}





#??
driver=com.mysql.jdbc.Driver
#???????
#url=jdbc:mysql://localhost:3306/myshop1?characterEncoding=utf-8&useSSL=true
url=jdbc:mysql://localhost:3306/petshop?characterEncoding=utf-8&useSSL=true
#???
uname=root
#??
password=111111


#???????
#url=jdbc:mysql://localhost:3306/myshop?characterEncoding=utf-8




显示下行号,test a main.java 中12行

DBUtil.getconn,应该是数据库没有链接成功

读取db.properties文件出错了,你文件里的中文怎么都乱码了,把空行和注释删一删试试

首先在DBUtil第19行打上断点,然后按f6进入,看看是否报空指针异常,如果是,说明没有读取到db.properties文件内容,没有成功创建数据库连接对象,然后再main方法第12行System.out.printIn(aa)之前添加一句代码System.out.printIn("进入输出方法");,如果该代码成功输出说明你查询出的list为null,然后否换时加上非空判断

img

这玩意儿null了,一般来说的文件没读到,用 getResourceAsStream方法很容易出现这种问题

img

没获取到连接,getConn返回是空

应该是你配置的db.properties没有读取到.看一下这个配置文件路径是否正确

img


你确定你这个地址是对的?

可以远程点你电脑进行断点调试吗?2个问题一起帮你定位解决。

把当前系统变量打印出来

获取文件流 this.getClass().getClassLoader().getResourceAsStream(""); 这块是个null,所以报的空指针。

img