尝试调用虚拟方法';长java.util.Date.getTime()';

尝试调用虚拟方法';长java.util.Date.getTime()';,java,android,Java,Android,我是android新手,对java程序有点困惑。在我的程序中,我创建了4个时间选择器,用于拾取时间进入和超时。之后,editText将显示总小时数 SimpleDateFormat format = new SimpleDateFormat("HH:mm"); Date dateb=null; Date datec=null; Date dateb1=null; Date datec1=null;

我是android新手,对java程序有点困惑。在我的程序中,我创建了4个时间选择器,用于拾取时间进入和超时。之后,editText将显示总小时数

 SimpleDateFormat format = new SimpleDateFormat("HH:mm");
            Date dateb=null;
            Date datec=null;
            Date dateb1=null;
            Date datec1=null;
            Date dateb2=null;
            Date datec2=null;
            Date dateb3=null;
            Date datec3=null;


            try {
                    dateb = format.parse(b);
                    datec = format.parse(c);
                    long difference = datec.getTime() - dateb.getTime();
                    int minutes = (int) ((difference / (1000 * 60)) % 60);
                    int hours = (int) ((difference / (1000 * 60 * 60)) % 24) - 1;
                    editTextH1.setText((hours + ":" + minutes));
                } catch (Exception e) {

                    System.err.println("ouch!");
                }
                    try {

                         dateb1 = format.parse(d);
                         datec1 = format.parse(e1);
                        long difference1 = datec1.getTime() - dateb1.getTime();
                        int minutes1 = (int) ((difference1 / (1000 * 60)) % 60);
                        int hours1 = (int) ((difference1 / (1000 * 60 * 60)) % 24) - 1;
                        editTextH2.setText((hours1 + ":" + minutes1));
                    } catch (Exception e) {

                        System.err.println("ouch!");
                    }
            try {

                dateb2 = format.parse(f);
                 datec2 = format.parse(g);
                long difference2 = datec2.getTime() - dateb2.getTime();
                int minutes2 = (int) ((difference2 / (1000 * 60)) % 60);
                int hours2 = (int) ((difference2 / (1000 * 60 * 60)) % 24) - 1;
                editTextH3.setText((hours2 + ":" + minutes2));
            } catch (Exception e) {

                System.err.println("ouch!");
            }
            try {
                 dateb3 = format.parse(h);
                 datec3 = format.parse(i);
                long difference3 = datec3.getTime() - dateb3.getTime();
                int minutes3 = (int) ((difference3 / (1000 * 60)) % 60);
                int hours3 = (int) ((difference3 / (1000 * 60 * 60)) % 24) - 1;
                editTextH4.setText((hours3 + ":" + minutes3));
            }catch (Exception e) {

                System.err.println("ouch!");
            }

// display total hours 
                long dateb_sum = dateb.getTime() + dateb1.getTime() + dateb2.getTime()+dateb3.getTime();
                long datec_sum = datec.getTime() + datec1.getTime() + datec2.getTime()+datec3.getTime();
                long difference4 = datec_sum - dateb_sum;
                int minutes4 = (int) ((difference4/ (1000*60)) % 60);
                int hours4  = (int) ((difference4/ (1000*60*60)) % 24)-1;
                editText8.setText((hours4+":"+minutes4));

                }


            }
当我运行我的应用程序时,它在时间选择器上崩溃,项目被迫停止。我已初始化了所有editText,但仍然收到此错误。有人能帮我吗?谢谢

LogCat

 10-01 01:21:13.041    4552-4552/com.example.project.project E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.example.project.project, PID: 4552
    java.lang.NullPointerException: Attempt to invoke virtual method 'long java.util.Date.getTime()' on a null object reference
            at com.example.project.project.WorkDetailsTable$TimePick.onTimeSet(WorkDetailsTable.java:381)
            at android.app.TimePickerDialog.onClick(TimePickerDialog.java:145)
            at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:163)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:148)
            at android.app.ActivityThread.main(ActivityThread.java:5417)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
我很确定错误来自下面的编码,因为当我删除它们时它不会崩溃。但是我需要他们来计算总小时数

long dateb_sum = dateb.getTime() + dateb1.getTime() + dateb2.getTime()+dateb3.getTime();
                    long datec_sum = datec.getTime() + datec1.getTime() + datec2.getTime()+datec3.getTime();
                    long difference4 = datec_sum - dateb_sum;
                    int minutes4 = (int) ((difference4/ (1000*60)) % 60);
                    int hours4  = (int) ((difference4/ (1000*60*60)) % 24)-1;
                    editText8.setText((hours4+":"+minutes4));

除了崩溃,我认为你正在使用大量的重复代码,你可以清理它。使用下面的方法。在参数中传递EditText和dates,并根据需要调用任意多的内容

setMyTime(EditText editText,String date1, String date2){
   SimpleDateFormat format = new SimpleDateFormat("HH:mm");
   try {
             Date d1 = format.parse(date1);
             Date d2 = format.parse(date2);
            long difference = d1.getTime() - d2.getTime();
            int minutes = (int) ((difference / (1000 * 60)) % 60);
            int hours = (int) ((difference / (1000 * 60 * 60)) % 24) - 1;
            editText.setText((hours + ":" + minutes));
        }catch (Exception e) {

            System.err.println(e.printStackTrace());
        }
}
例如:

setMyTime(editTextH1,b,c);
setMyTime(editTextH2,d,e);
setMyTime(editTextH3,f,g);
setMyTime(editTextH4,h,i);

这应该是datec1=format.parse(e1);或datec1=format.parse(e);我使用e1而不是ecely。当您尝试调用getTime()时,其中一个日期对象看起来肯定是空的。但我看不出是哪一个。你能提供堆栈跟踪吗?@NickJ你是说logcat吗?你得到的错误消息必须发生在代码末尾附近的部分,没有try-catch块,但唯一可能发生的方法是如果某个日期没有初始化,如果try-catch块吞没了另一个异常,就会发生这种情况。你有没有“哎哟!”错误日志中的消息?当出现异常时,只打印一条愚蠢的消息,如
“哎哟!”
,是不可接受的。打印异常附带的消息和异常类。@EJP如果您能帮助我解决问题,那就太好了……感谢您的代码并轻松发现问题。@Hoo该问题是一个常见的NPE或花园NPE。解决方案不是像复制品所说的那样,遵从空指针,以及这里的一千个或更多其他问题。问题已经解决:)