【发布时间】: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