List.add()方法在公共类中给出错误

时间:2018-06-27 13:37:00

标签: java

我是一名Java学习者,实例化列表对象并在公共类中调用add方法时遇到错误。如果将代码放入main方法或将method声明为static,则相同的代码不会给我任何错误。下面是代码段。

public class UserDao {
    //private  static List<UserBean> user = new ArrayList<>();//---->  no erros
    private  List<UserBean> user = new ArrayList<>();//--> remove static
    //static {
    user.add(new UserBean(1, "Harshit", "Madhapur"));//---->gives me error if remove comments.(static)
    user.add(new UserBean(2, "Sushil", "Hyderabad"));
    user.add(new UserBean(3, "Mohit", "Delhi"));
    user.add(new UserBean(4, "Shantanu", "Dampur"));
    //}
    public List<UserBean> findAll() {
        return user;
    }
    public UserBean getUserById(Integer id){
        for (UserBean userBean : user) {
            if(userBean.getId() == id){
                return userBean;
            }
        }
        return null;
    }
}

5 个答案:

答案 0 :(得分:0)

您不能在方法或初始化程序之外执行语句 1

这是不可能的:

class A {
    System.out.println("Hello world"); // Compilation error
}

这是可能的,但它是静态的:

class A {
    static {
        System.out.println("Hello world");
    }
}

如果您要在此处删除static,可以但不删除括号。它将成为一个初始化器。

class A {
    {
        System.out.println("Hello world");
    }
}

但是由于超出此答案范围的原因,我们不建议这样做。

您想要的是在构造函数中执行初始化代码,该构造函数实际上是“最后一个”初始化程序 2 ,如果您有很多:

class A {
    public A() {
        System.out.println("Hello world");
    }
}



1您可以在初始化程序之外执行代码,但只能作为字段声明的一部分,例如List lst = Arrays.asList("a", "b");
2并非完全如此,但又超出了此答案的范围。

答案 1 :(得分:0)

您无法从静态代码块(静态方法或静态初始化块)访问非静态字段。仅非静态代码块中可用的字段。这是合法的:

public class UserDao {
    private  List<UserBean> user = new ArrayList<>();//non-static field
    {//access from non-static code block
      user.add(new UserBean(1, "Harshit", "Madhapur"));
      //skiped
    }
//skiped
}

但是您可以从任何地方(静态方法,静态初始化块,非静态初始化块,非静态方法)访问静态字段

public class UserDao {
    private  static List<UserBean> user = new ArrayList<>();
    static{//access to static field from static initialization block
        user.add(new UserBean(1, "Harshit", "Madhapur"));
      //skiped
    }
    {//access to static field from non-static initialization block
        user.add(new UserBean(2, "Hars", "Shapur"));
    }
//skiped
}

答案 2 :(得分:0)

静态块用于初始化静态变量。那就是为什么

private  List<UserBean> user = new ArrayList<>();
static {
user.add(new UserBean(1, "Harshit", "Madhapur"));
user.add(new UserBean(2, "Sushil", "Hyderabad"));
user.add(new UserBean(3, "Mohit", "Delhi"));
user.add(new UserBean(4, "Shantanu", "Dampur"));
}

将导致错误。

private  static List<UserBean> user = new ArrayList<>();
static {
user.add(new UserBean(1, "Harshit", "Madhapur"));
user.add(new UserBean(2, "Sushil", "Hyderabad"));
user.add(new UserBean(3, "Mohit", "Delhi"));
user.add(new UserBean(4, "Shantanu", "Dampur"));
}

将正常运行。

答案 3 :(得分:0)

创建对象后,请使用静态块或将元素添加到列表中。

// inside UserDao class
public void add(UserBean ub) {
    user.add(ub);
}

[...]

public static void main(String[] args) {
    UserDao user = new UserDao();

    user.add(new UserBean(1, "Harshit", "Madhapur"));
    user.add(new UserBean(2, "Sushil", "Hyderabad"));
    user.add(new UserBean(3, "Mohit", "Delhi"));
    user.add(new UserBean(4, "Shantanu", "Dampur"));
}

答案 4 :(得分:0)

根据您的问题,它将给出错误,因为在这种情况下,静态块将尝试初始化非静态成员。不能静态引用非静态字段。

您可以根据自己的应用和成员的进一步使用情况选择以下两个选项:

  1. 将列表设为 static ,然后尝试填充静态块中的项目。
  2. 避免对两者都使用static。