【问题标题】:Why do I get NullPointerException: Attempt to invoke virtual method 'long java.lang.Long.longValue()' …?为什么我得到 NullPointerException: Attempt to invoke virtual method 'long java.lang.Long.longValue()' ...?
【发布时间】:2019-09-10 10:52:19
【问题描述】:

代码:

public void onBindViewHolder(@NonNull MyHolder holder, int position) {

        String message = chatList.get(position).getMessage();
        String timeStamp = chatList.get(position).getTimestamp();

        Calendar cal = Calendar.getInstance();
        cal.setTimeInMillis(Long.parseLong(timeStamp));
        String dataTime = format("MMMM d, h:mm a", cal).toString();


        holder.timeTv.setText(dateTime);

错误信息:

java.lang.NullPointerException: Attempt to invoke virtual method 'long 
java.lang.Long.longValue()' on a null object reference

【问题讨论】:

  • Long.getLong(timeStamp) - 你不希望那里有 getLong() 方法。这不是你认为的那样。也许你想要parseLong()
  • 好的,您编辑了它,但现在异常消息与该代码不匹配。 parseLong() 返回一个原语 long
  • 您将timestamp 设为空。所以请用空检查结束它。
  • String timeStamp = chatList.get(position).getTimestamp(); 这个代码可以吗?平均时间戳只有数值?
  • 我正在观看本教程 (youtube.com/…),这里的代码正在运行。

标签: android date calendar android-calendar


【解决方案1】:

调试您的代码/打印日志并确保您没有得到 getTimestamp 的 null 值并尝试这样做会起作用

   String dataTime = String.valueOf(format("MMMM d, h:mm a", cal));

【讨论】:

  • 仍然给出错误:进程:com.example.bkkapp,PID:10207 java.lang.NumberFormatException:在 java.lang.Long.parseLong 处为空(Long.java:553)在 java.lang 处。 Long.parseLong(Long.java:632) 在 com.example.bkkapp.adapters.AdapterChat.onBindViewHolder(AdapterChat.java:75) 在 com.example.bkkapp.adapters.AdapterChat.onBindViewHolder(AdapterChat.java:32)跨度>
  • 请尝试将硬编码的“1568117980”作为时间戳,看看是否仍然出现空异常
  • 嘿意大利费尔德曼。硬编码选项有效!但那我怎么能将时间(硬编码长)设置为时间戳字符串?
  • @MolnarAttila 如果硬编码有效,则意味着您在未硬编码时仍然为空。如果您能详细说明,我在您的评论中不太明白这个问题。无论如何,首先,请确保您没有从 getTimestamp() 方法中获得空值。
  • @Italy Feldman 是的,我明白你的意思。基本上时间戳已添加到 FirebaseDatabase 中,现在我正在尝试弄清楚如何找回那个时间。
【解决方案2】:

我也面临同样的问题。我使用了以下代码,它对我有用。

private static DateTimeFormatter timestampFormatter = new DateTimeFormatterBuilder()
        .appendValue(ChronoField.INSTANT_SECONDS)
        .appendValue(ChronoField.MILLI_OF_SECOND, 3)
        .toFormatter();

private static DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd/MM/yyyy hh:mm a");

然后在onBindViewHolder中,我添加了如下sn-p:

 Instant inst;
        if (timeStamp == null) {
            inst = Instant.now();
        } else {
            inst = Instant.from(timestampFormatter.parse(timeStamp));
       }
        String dateTime = inst.atZone(ZoneId.systemDefault()).format(dtf);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-27
    • 1970-01-01
    • 1970-01-01
    • 2020-03-19
    • 2020-01-20
    • 1970-01-01
    相关资源
    最近更新 更多