无效的内存地址或空指针解引用,当数据库返回空集时。

huangapple go评论106阅读模式
英文:

Invalid memory address or nil pointer dereference when database returns empty set

问题

当我将事件ID传递给DisplayScanMembers(23)时,如果数据库中不存在该event_id,它将返回一个空集。然而,显然一个空集等同于一个空指针(我猜)。因此,我无法将值(空指针)赋给DisplayScanMembers函数中的'member_s'。

我只需要getScanMembers方法在数据库查询返回空集时返回一个空数组,而不是空指针。

我得到的错误信息:

ERROR 2014/10/22 23:08:19 panic.go:29: runtime error: invalid memory address or nil pointer dereference
/home/developer/gocode/src/drakecheckin/app/controllers/scan.go:236 (0x4a21f8)

  1. func (c Scan) DisplayScanMembers(id int64) revel.Result{
  2. if (id == -1 || id == 0){
  3. event,_ :=c.getLatestSelectedEvent();
  4. member_s,_ := c.getScanMembers(event.EventId);
  5. return members;
  6. } else {
  7. member_s,err2 := c.getScanMembers(id);
  8. if err2 !=nil {
  9. event,_ :=c.getLatestSelectedEvent();
  10. member_s,_ = c.getScanMembers(event.EventId);
  11. }
  12. return member_s;
  13. }
  14. }
  15. func (c Scan) getScanMembers(event_id int64) (revel.Result,error) {
  16. group_id,_ := convStrInt(c.Session["group_id"]);
  17. org_id,_ := convStrInt(c.Session["org_id"]);;
  18. query := "SELECT me.member_event_id,m.member_first_name,m.member_last_name,m.member_uniq_num "+
  19. "FROM MemberEvent AS me JOIN Member AS m ON m.member_id =me.member_id AND m.org_id =me.org_id "+
  20. "WHERE me.group_id=? AND me.org_id=? AND me.event_id=?";
  21. members, err := c.Txn.Select(models.AllMemberEvent{}, query, group_id, org_id, event_id);
  22. if err != nil {
  23. return nil,err;
  24. }
  25. return c.RenderJson(members),nil;
  26. }
英文:

When I pass event id in to DisplayScanMembers(23), if the event_id does not appear in the database, it returns an empty set. However, apparently an empty set is equivalent a nil pointer(I guess). Therefore I cannot assign the value(nil pointer) to 'member_s' in the DisplayScanMembers function.

All I need is for the getScanMembers method to return an empty array instead nil if the database query returns a empty set.

Error that I get:

ERROR 2014/10/22 23:08:19 panic.go:29: runtime error: invalid memory address or nil pointer dereference
/home/developer/gocode/src/drakecheckin/app/controllers/scan.go:236 (0x4a21f8)

  1. func (c Scan) DisplayScanMembers(id int64) revel.Result{
  2. if (id == -1 || id == 0){
  3. event,_ :=c.getLatestSelectedEvent();
  4. member_s,_ := c.getScanMembers(event.EventId);
  5. return members;
  6. } else {
  7. member_s,err2 := c.getScanMembers(id);
  8. if err2 !=nil {
  9. event,_ :=c.getLatestSelectedEvent();
  10. member_s,_ = c.getScanMembers(event.EventId);
  11. }
  12. return member_s;
  13. }
  14. }
  15. func (c Scan) getScanMembers(event_id int64) (revel.Result,error) {
  16. group_id,_ := convStrInt(c.Session["group_id"]);
  17. org_id,_ := convStrInt(c.Session["org_id"]);;
  18. query := "SELECT me.member_event_id,m.member_first_name,m.member_last_name,m.member_uniq_num "+
  19. "FROM MemberEvent AS me JOIN Member AS m ON m.member_id =me.member_id AND m.org_id =me.org_id "+
  20. "WHERE me.group_id=? AND me.org_id=? AND me.event_id=?";
  21. members, err := c.Txn.Select(models.AllMemberEvent{}, query, group_id, org_id, event_id);
  22. if err != nil {
  23. return nil,err;
  24. }
  25. return c.RenderJson(members),nil;
  26. }

答案1

得分: 1

我认为你的问题在于"getScanMembers"函数。你的返回语句是revel.Result,如果有错误,你这样处理:

  1. if err != nil {
  2. return nil, err;
  3. }

但是你应该这样处理:

  1. if err != nil {
  2. return revel.Result{}, err;
  3. }
英文:

I think your problem in "getScanMembers" function. Your return statement is revel.Result, and if you have error, you doing this:

  1. if err != nil {
  2. return nil, err;
  3. }

But you should doing this:

  1. if err != nil {
  2. return revel.Result{}, err;
  3. }

huangapple
  • 本文由 发表于 2014年10月23日 12:49:32
  • 转载请务必保留本文链接:https://go.coder-hub.com/26521490.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定