Java 将用户输入添加到导致NullPointerException的电子邮件
我正在创建一个应用程序,它通过EditText和Checkbox接收一些用户输入,并将它们放入电子邮件的主题和正文中 每当我运行并试图在try块中设置主题时,我的电子邮件都不会发送,并且会出现那些LogCat错误Java 将用户输入添加到导致NullPointerException的电子邮件,java,android,jakarta-mail,Java,Android,Jakarta Mail,我正在创建一个应用程序,它通过EditText和Checkbox接收一些用户输入,并将它们放入电子邮件的主题和正文中 每当我运行并试图在try块中设置主题时,我的电子邮件都不会发送,并且会出现那些LogCat错误 public void sendEmails() { new AsyncTask<Void, Void, Void>() { @Override protected Void doInBackground(Void... arg
public void sendEmails() {
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... arg0) {
String subject = "Maintenance Request";
CheckBox main = (CheckBox) findViewById(R.id.checkBox1);
CheckBox kitchen = (CheckBox) findViewById(R.id.checkBox2);
CheckBox bathroom = (CheckBox) findViewById(R.id.checkBox3);
CheckBox other = (CheckBox) findViewById(R.id.checkBox4);
String host = "smtp.gmail.com";
String username = "user@gmail.com";
String password = "pwd";
Properties props = new Properties();
props.put("mail.smtp.ssl.enable", "true");
Session session = Session.getInstance(props);
session.setDebug(true);
MimeMessage msg = new MimeMessage(session);
MimeMessage msg1 = new MimeMessage(session);
try {
if (main.isChecked()) {
subject = subject + " - Main Room";
}
if (kitchen.isChecked()) {
subject = subject + " - Kitchen";
}
if (bathroom.isChecked()) {
subject = subject + " - Bathroom";
}
if (other.isChecked()) {
subject = subject + " - Other";
}
return subject;
}
msg.setFrom(new InternetAddress(username));
msg1.setFrom(new InternetAddress(username));
msg.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(to));
msg1.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(manager));
msg.setSubject("Maintenance Confirmation");
msg1.setSubject(subject);
msg.setText("Some really important stuff. Confirmed.");
msg1.setText("Really important stuff needs attention");
props.put("mail.smtps.auth", "true");
props.put("mail.smtp.quitwait", "false");
Transport t = session.getTransport("smtps");
try {
t.connect(host, username, password);
t.sendMessage(msg, msg.getAllRecipients());
t.sendMessage(msg1, msg1.getAllRecipients());
}
finally {
t.close();
} }
catch(Exception exc){
exc.printStackTrace();
}
return null;
}}.execute(); }
我知道代码是好的,因为如果我硬编码的主题,而不调用的方法,电子邮件发送罚款
编辑:这是日志。应用程序不再在最后一次按下按钮时崩溃,但电子邮件不会发送,我在LogCat中看到这些错误是黄色的,而不是红色的。有人能理解我的线程在做什么并提供解决方案吗
- 04-14 11:16:34.532:W/System.err(14378):java.lang.NullPointerException
- 04-14 11:16:34.532:W/System.err(14378):在com.example.maintenanceapp.lastpage$1.doInBackground(lastpage.java:79)
- 04-14 11:16:34.532:W/System.err(14378):在com.example.maintenanceapp.lastpage$1.doInBackground(lastpage.java:1)
- 04-14 11:16:34.532:W/System.err(14378):在android.os.AsyncTask$2.call(AsyncTask.java:287)
- 04-14 11:16:34.532:W/System.err(14378):位于java.util.concurrent.FutureTask.run(FutureTask.java:234)
- 04-14 11:16:34.532:W/System.err(14378):atandroid.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
- 04-14 11:16:34.532:W/System.err(14378):位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
- 04-14 11:16:34.532:W/System.err(14378):位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
- 04-14 11:16:34.537:W/System.err(14378):在java.lang.Thread.run(Thread.java:864)处
AsyncTask
后台线程中访问UI。此线程无法访问UI线程,很容易导致类似的问题
您需要将与UI相关的所有代码从doInBackground()
方法移动到另一个方法,该方法覆盖AsyncTask
,例如onPreExecute()
方法,或者,您可以在运行任务之前将其移动到,以获得相同的结果。例如:
private String subject = "Maintenance Request";
@Override
protected void onPreExecute() {
CheckBox main = (CheckBox) findViewById(R.id.checkBox1);
CheckBox kitchen = (CheckBox) findViewById(R.id.checkBox2);
CheckBox bathroom = (CheckBox) findViewById(R.id.checkBox3);
CheckBox other = (CheckBox) findViewById(R.id.checkBox4);
if (main.isChecked()) subject = subject + " - Main Room";
if (kitchen.isChecked()) subject = subject + " - Kitchen";
if (bathroom.isChecked()) subject = subject + " - Bathroom";
if (other.isChecked()) subject = subject + " - Other";
}
或者您可以将其移动到sendmails()之前在按钮click3()
方法中的code>行
它不发送电子邮件,因为发生错误,在发送电子邮件之前,try/catch中的代码的进一步执行被终止
你也应该考虑更多地了解AsyncTask,我发现这很有见识:
对原问题的答复:
这可能是因为您在单独的方法中定义了subject
变量,因此subject
变量超出了范围。但是,您的setSubject()
方法返回subject
变量的值,因此要解决此问题,您可以从单击侦听器中删除setSubject()
方法调用并更改此行:
msg1.setSubject(subject);
为此:
msg1.setSubject(setSubject());
您正在使用Eclipse吗?您能指出lastpage.java中的第79行是哪一行吗?你能告诉我你什么时候完成编辑吗?因为如果这个最新版本是你的代码,我可以清楚地看到问题是什么…这是我最新的版本,因为我用它来查找错误。lastpage.java上的第79行是“if(main.isChecked()){”好的,谢谢我更新了答案我也尝试了,不幸的是我得到了完全相同的错误。我还尝试创建一个名为string someSubject=setSubject()的字符串;然后设置msg1.setSubject(someSubject);并出现了相同的错误。好的,不用担心,您可能应该更新您的帖子,说明这是您尝试过的事情之一。我看不出此代码有任何其他明显的错误,尽管明显缺少很多代码,其中一部分可能会导致此问题。您可能需要发布活动和XML的完整内容java文件,以便任何人都能理解这个问题。此外,您的LogCat看起来可能还有更多内容。如果您能提供这些额外信息,如果我能为您找到问题的根源,我将更新我的答案。我看到这里的逻辑和理论上应该是可行的。但现在我面临着获取Strin的问题该方法中的g变量。正如您所看到和知道的,onPreExecute必须是void类型,因此我无法返回字符串。我尝试设置setSubject()方法再次返回字符串并在onPreExecute中调用它,但这会使它超出我的doInBackground的作用域,并且无法将其设置为subject。假设AsyncTask类是activity类的子类,doInBackground函数仍然可以访问activity类的属性。因此,您应该已经定义了subject变量作为活动类的属性,例如private String subject=“”;位于活动类的开头,它将在范围内。如果这仍然导致问题,您可以将此代码从onPreExecute移动到运行任务之前,如回答中所述。
msg1.setSubject(setSubject());