gpt4 book ai didi

android - NumberFormatException 无效长与日历

转载 作者:行者123 更新时间:2023-11-29 00:14:43 25 4
gpt4 key购买 nike

我遇到了这个 NumberFormatException Invalid Long 的问题。日志 cat 显示错误来自方法的 Long.parseLong 部分。

  public static String getDateTimeStr(String p_time_in_millis) {
SimpleDateFormat sdf = new SimpleDateFormat(DATE_TIME_FORMAT);
Date l_time = new Date(Long.parseLong(p_time_in_millis));
return sdf.format(l_time);
}

有人能告诉我为什么当我在某些日历中获取和显示数据然后在我设备上的其他日历中我得到这个 NumberFormatException Invalid Long 时这段代码工作正常吗?

编辑:这是剩余的代码……

private void getEvents() {

Uri l_eventUri;
ArrayList<Map<String, String>> allStudents = new ArrayList<Map<String, String>>();

if (Build.VERSION.SDK_INT >= 8) {
l_eventUri = Uri.parse("content://com.android.calendar/events");
} else {
l_eventUri = Uri.parse("content://calendar/events");
}

String[] l_projection = new String[]{"title", "dtstart", "dtend"};

@SuppressWarnings("deprecation")
Cursor l_managedCursor = this.managedQuery(l_eventUri, l_projection, "calendar_id=" + m_selectedCalendarId, null, "dtstart DESC, dtend DESC");

if (l_managedCursor.moveToFirst()) {


int l_colTitle = l_managedCursor.getColumnIndex(l_projection[0]);
int l_colBegin = l_managedCursor.getColumnIndex(l_projection[1]);
int l_colEnd = l_managedCursor.getColumnIndex(l_projection[2]);

String l_title = String.valueOf(l_colTitle);
String l_begin = Integer.toString(l_colBegin);
String l_end = Integer.toString(l_colEnd);

do {

Map<String, String> map = new HashMap<String, String>();

l_title = l_managedCursor.getString(l_colTitle);
l_begin = getDateTimeStr(l_managedCursor.getString(l_colBegin));
l_end = getDateTimeStr(l_managedCursor.getString(l_colEnd));

map.put("eventTitles", l_title);
map.put("event_begin", l_begin);
map.put("event_end", l_end);
allStudents.add(map);


} while (l_managedCursor.moveToNext());

l_managedCursor.close();

SimpleAdapter adapter = new SimpleAdapter(this, allStudents, R.layout.notice_layout, new String[] { "eventTitles", "event_begin", "event_end" }, new int[] { R.id.tvTitle, R.id.tvBody, R.id.tvTeacherCode});
listViewCalendar.setAdapter(adapter);

}


}

编辑 2:

出于某种原因,代码在没有这行代码的情况下也能正常工作,所以我将其固定在这行代码中。

l_end = getDateTimeStr(l_managedCursor.getString(l_colEnd));

为什么 l_colEnd 会陷入 NumberFormatExcetion?当以下代码行也可能因为查询相同的 int 格式而陷入相同的 NumberFormatException 时?

l_begin = getDateTimeStr(l_managedCursor.getString(l_colBegin));

也感谢所有帮助过的人。另一件有趣的事情是当我添加这个时

int l_cnt = 0;
do {
++l_cnt;
} while (l_managedCursor.moveToNext() && l_cnt < 100);

while 子句,如下面代码末尾所示,应用程序运行正常,没有代码行抛出 NumberFormatException..

if (l_managedCursor.moveToFirst()) {

int l_cnt = 0;

int l_colTitle = l_managedCursor.getColumnIndex(l_projection[0]);
int l_colBegin = l_managedCursor.getColumnIndex(l_projection[1]);
int l_colEnd = l_managedCursor.getColumnIndex(l_projection[2]);

String l_title = String.valueOf(l_colTitle);
String l_begin = Integer.toString(l_colBegin);
String l_end = Integer.toString(l_colEnd);

do {

Map<String, String> map = new HashMap<String, String>();

l_title = l_managedCursor.getString(l_colTitle);
l_begin = getDateTimeStr(l_managedCursor.getString(l_colBegin));
l_end = getDateTimeStr(l_managedCursor.getString(l_colEnd));

map.put("eventTitles", l_title);
map.put("event_begin", l_begin);
map.put("event_end", l_end);
allStudents.add(map);

++l_cnt;

} while (l_managedCursor.moveToNext() && l_cnt < 100);

最佳答案

Can someone tell me why this code works fine when I fetch and display the data in certain calendars then in other calendars on my device I get this NumberFormatException Invalid Long please?

Date l_time = new Date(Long.parseLong(p_time_in_millis));

国际海事组织。此代码是“坏”代码。

为什么?您尝试从未经检查的来源获取未知数据

"content://com.android.calendar/events""content://calendar/events"

几乎每个人都可以访问日历并保存他喜欢的任何东西......遗憾的是没有使用它的规则!因此,大胆猜测一个应用程序正在使用此事件列以另一种您预期的格式保存数据。

Regarding the check l_cnt < 100, where fail stops

它不会失败,因为错误发生在 101 事件或更晚的事件上!


我的解决方案是检查我的数据,永远不要相信其他应用程序会按照我的预期或应该的方式运行。

所以我建议改成getDateTimeStr方法如下:

   public static String getDateTimeStr(String p_time_in_millis) {
SimpleDateFormat sdf = new SimpleDateFormat(DATE_TIME_FORMAT);
long timestamp = 0;
try {
timestamp = Long.parseLong(p_time_in_millis)
} catch(NumberFormatException e) {
Log.w("getDateTimeStr", "Cannot convert '"+p_time_in_millis+"' to long");
e.printStackTrace(); // Prints full error exception
}
Date l_time = new Date(timestamp);
return sdf.format(l_time);
}

删除 l_cnt < 100检查并留下代码以运行检查您的 logcat!您现在可以更好地了解正在发生的事情,并且您的数据日期将是 1/1/1970(由于 0 时间戳)代码可以响应地更改以处理该日期没有预期的格式。

处理错误的一些思路:

  • 制作getDateTimeStrgetEvents() 抛出异常它可以捕获它并忽略具有意外数据的事件。 (处理逻辑,忽略我看不懂的。)
  • 识别 p_time_in_millis 的格式在每个不同的情况下使用不同的 DATE_TIME_FORMAT关于每个事件的确切格式的类型。好吧,这需要大量调查,但仍然会失败。此外,您还必须添加格式仍然未知的情况,因此可以忽略它或使用默认值以免崩溃。

通常,您总是尝试编写一个稳定的应用程序,如果另一个应用程序以不同的格式保存数据(因为它喜欢这样或由于它自己的错误),它不会失败

关于android - NumberFormatException 无效长与日历,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27586928/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com