Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将用户输入添加到导致NullPointerException的电子邮件_Java_Android_Jakarta Mail - Fatal编程技术网

Java 将用户输入添加到导致NullPointerException的电子邮件

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

我正在创建一个应用程序,它通过EditText和Checkbox接收一些用户输入,并将它们放入电子邮件的主题和正文中

每当我运行并试图在try块中设置主题时,我的电子邮件都不会发送,并且会出现那些LogCat错误

     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());