尝试调用虚拟方法';长java.util.Date.getTime()';
我是android新手,对java程序有点困惑。在我的程序中,我创建了4个时间选择器,用于拾取时间进入和超时。之后,editText将显示总小时数尝试调用虚拟方法';长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;
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。解决方案不是像复制品所说的那样,遵从空指针,以及这里的一千个或更多其他问题。问题已经解决:)