【问题标题】:NullPointerException when getting String from another activity从另一个活动获取字符串时出现 NullPointerException
【发布时间】:2013-12-15 11:15:59
【问题描述】:

我正在使用 javamail 创建一个邮件客户端。我设置了一个登录活动来存储邮件和密码。我有在一个名为 Data.java 的类中发送邮件的代码。问题是我无法从那里获得 SharedPreferences,因为它不是一个 Activity,也没有扩展 PreferenceActivity。我需要使用Looper.prepare(),否则它会引发另一个异常。我正在尝试从 MainActivity 获取共享首选项,但是当我尝试打印它时得到一个 NullPointerException。我的 MainActivity 代码:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        SharedPreferences prefs = getSharedPreferences("loginPrefs", Context.MODE_PRIVATE);
        mail1 = prefs.getString("email", null);
        pass = prefs.getString("pass", null);

        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.container, new PlaceholderFragment())
                    .commit();
        }
    }

    public String getMail1(){
        return mail1;
    }
    public String getPass(){
        return pass;
    }

Data.java 代码:

public class Data{

    String a;
    String b;

    private void getEverything(){
        Looper.prepare();
        MainActivity d = new MainActivity();
        a = d.getMail1();
        b = d.getPass();
    }


    public void sendMail(){
        getEverything();
        Properties props = new Properties();
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.host", "smtp.gmail.com");
        props.put("mail.smtp.port", "587");

        Session session = Session.getInstance(props,
                new javax.mail.Authenticator() {
                    protected PasswordAuthentication getPasswordAuthentication() {
                        return new PasswordAuthentication(a, b);
                    }
                });

        try {

            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress(a));
            message.setRecipients(Message.RecipientType.TO,
                    InternetAddress.parse(gmail.to));
            message.setSubject(gmail.subject);
            message.setText(gmail.text);

            Transport.send(message);
            System.out.println(a);
            System.out.println(b);
            System.out.println("Done");

        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }
}

日志猫:

java.lang.RuntimeException: An error occured while executing doInBackground()
            at android.os.AsyncTask$3.done(AsyncTask.java:299)
            at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
            at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
            at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
            at java.util.concurrent.FutureTask.run(FutureTask.java:137)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
            at java.lang.Thread.run(Thread.java:856)
     Caused by: java.lang.NullPointerException
            at com.android.internal.os.LoggingPrintStream.println(LoggingPrintStream.java:298)
            at com.test.email.Data.sendMail(Data.java:61)
            at com.test.email.gmail.doInBackground(gmail.java:40)
            at com.test.email.gmail.doInBackground(gmail.java:19)
            at android.os.AsyncTask$2.call(AsyncTask.java:287)
            at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
            at java.util.concurrent.FutureTask.run(FutureTask.java:137)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
            at java.lang.Thread.run(Thread.java:856)

【问题讨论】:

  • 您在哪一行得到 nullPointerException?
  • @niteshgoel 如果我让它像我发布的代码一样,我首先会得到一个身份验证异常,但是当我手动输入邮件并传递时,我会在第一个 System.out.println 中得到它跨度>
  • 能否贴出错误日志
  • @niteshgoel 使用 logcat 编辑帖子
  • 贴出这个错误的来源代码。

标签: java android nullpointerexception sharedpreferences


【解决方案1】:
System.out.println(a);
System.out.println(b);

abnull。这就是 NPE 的原因。

他们是null的原因:

MainActivity d = new MainActivity();

永远不要使用new 实例化活动。 (请改用Intent。但您不需要在此处实例化活动。)

因此,您在此处获得的活动对象与您在其中设置变量值的活动不同。

相反,在Data 类中传递您需要的任何值作为方法参数,例如

public void sendMail(String email, String password) { ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-28
    • 2016-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多