【问题标题】:nullpointer when using shared prefference in no activity class [duplicate]在非活动类中使用共享首选项时的空指针[重复]
【发布时间】:2016-12-23 04:24:34
【问题描述】:

所以我试图在没有活动的类中使用我的共享首选项,但我不断收到空指针

private SharedPreferences settingPreferences = context.getSharedPreferences("Settings", Activity.MODE_PRIVATE);

我该如何解决?

 public class ConnectionClass
{
    Context context;
    private SharedPreferences setingPreferences = context.getSharedPreferences("Settings", Activity.MODE_PRIVATE);
    String ip;
    String classs = "net.sourceforge.jtds.jdbc.Driver";
    String db = "ISTABLocalDB";
    String un = "istab_wpf";
    String password = "istab_!234";
    @SuppressLint("NewApi")
    public Connection CONN() {
        ip = setingPreferences.getString("server", "");
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
                .permitAll().build();
        StrictMode.setThreadPolicy(policy);
        Connection conn = null;
        String ConnURL = null;
        try {
            Class.forName(classs);
            ConnURL = "jdbc:jtds:sqlserver://" + ip + ";"
                    + "databaseName=" + db + ";user=" + un + ";password="
                    + password + ";";
            conn = DriverManager.getConnection(ConnURL);
        } catch (SQLException se) {
            Log.e("ERRO", se.getMessage());
        } catch (ClassNotFoundException e) {
            Log.e("ERRO", e.getMessage());
        } catch (Exception e) {
            Log.e("ERRO", e.getMessage());
        }
        return conn;

【问题讨论】:

  • 你能发布完整的课程吗
  • 这怎么可能是重复的?因为这是一个空指针,是由我的共享偏好的未初始化上下文引起的,而且这个问题只是一个更普遍的问题,所以根本没有帮助,知道什么是空指针

标签: android nullpointerexception sharedpreferences


【解决方案1】:

您在初始化之前使用上下文。在您的类构造函数中,将上下文作为参数,然后初始化您的偏好对象。

【讨论】:

    【解决方案2】:

    您需要初始化上下文变量。一种方法是通过在 ConnectionClass 中定义构造函数将上下文变量从活动类传递给这个非活动类

    public ConnectionClass (Context context)  
    {
       this.context = context;
    
    } 
    

    无论你要在哪里实例化这个类,通过从调用类传递上下文来实例化它。

    例如,如果你从一个活动类中实例化它,你可以这样做

    ConnectionClass conn = new ConnectionClass(MyActivity.this.getApplicationContext());
    

    【讨论】:

    • 所以如果我将我的public class ConnectionClass { 更改为public ConnectionClass (Context context) { this.context = context; } 那么我会得到预期的类或接口
    • 类就可以了,只需添加构造方法即可。然后您可以传递上下文变量以分配给您的类内上下文变量,从而避免空指针异常。
    • 太棒了,成功了
    • 很高兴为您提供帮助:)
    【解决方案3】:

    你必须初始化上下文。

    像这样获取构造函数的上下文:

    Context context;
    private SharedPreferences setingPreferences;
    
    public ConnectionClass(Context context){
        this.context = context;
    }
    
    public Connection CONN() {
        setingPreferences = context.getSharedPreferences("Settings", Activity.MODE_PRIVATE);
        ip = setingPreferences.getString("server", "");
    
        ...
    

    或者您可以直接在您正在调用的方法上获取上下文:

    private SharedPreferences setingPreferences;
    
    public Connection CONN(Context context) {
        setingPreferences = context.getSharedPreferences("Settings", Activity.MODE_PRIVATE);
        ip = setingPreferences.getString("server", "");
    
        ...
    

    【讨论】:

    • 这给了我错误:(427, 53) 错误:类 ConnectionClass 中的方法 CONN 不能应用于给定类型;必需:找到上下文:没有参数原因:实际参数列表和形式参数列表的长度不同
    • 我认为你在调用 CONN() 时没有传递参数,或者你传递的是不同的类型。你必须这样调用: Connection c = connectionClass.CONN(context);您是在活动类中调用该方法吗?
    • 我得到错误:(427, 53) 错误:类 ConnectionClass 中的方法 CONN 不能应用于给定类型;必需:找到上下文:无参数原因:try { Connection c = connectionClass.CONN‌​(context); if (con == null) { 上的实际参数列表和正式参数列表的长度不同,它无法解析方法和符号
    • 嗯,这可能是很多事情,但我会尽力提供帮助。首先,你需要有一个上下文,如果你在一个活动类中调用,你可以像这样传递: Context context = this;如果您不在活动课上,则必须以另一种方式获得。其次,我认为你使用了错误的变量名,“c”和“con”是一回事,不是吗?如果是,您必须将 c 重命名为 con 或将 con 重命名为 c。如果错误仍然存​​在,请告诉我您正在使用什么 IDE,并使用调用方法 CONN 的类的代码更新问题。
    猜你喜欢
    • 2017-04-11
    • 2015-03-01
    • 1970-01-01
    • 2023-03-09
    • 2012-08-01
    • 2015-09-04
    • 1970-01-01
    • 2023-03-04
    相关资源
    最近更新 更多