diff --git a/smack-core/src/main/java/org/jivesoftware/smack/util/LazyStringBuilder.java b/smack-core/src/main/java/org/jivesoftware/smack/util/LazyStringBuilder.java index 638ada32d..6baf74625 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/util/LazyStringBuilder.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/util/LazyStringBuilder.java @@ -1,6 +1,6 @@ /** * - * Copyright 2014 Florian Schmaus + * Copyright 2014-2017 Florian Schmaus * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,9 +19,13 @@ package org.jivesoftware.smack.util; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; public class LazyStringBuilder implements Appendable, CharSequence { + private static final Logger LOGGER = Logger.getLogger(LazyStringBuilder.class.getName()); + private final List list; private String cache; @@ -69,8 +73,15 @@ public class LazyStringBuilder implements Appendable, CharSequence { return cache.length(); } int length = 0; - for (CharSequence csq : list) { - length += csq.length(); + try { + for (CharSequence csq : list) { + length += csq.length(); + } + } + catch (NullPointerException npe) { + StringBuilder sb = safeToStringBuilder(); + LOGGER.log(Level.SEVERE, "The following LazyStringBuilder threw a NullPointerException: " + sb, npe); + throw npe; } return length; } @@ -107,6 +118,14 @@ public class LazyStringBuilder implements Appendable, CharSequence { return cache; } + public StringBuilder safeToStringBuilder() { + StringBuilder sb = new StringBuilder(); + for (CharSequence csq : list) { + sb.append(csq); + } + return sb; + } + /** * Get the List of CharSequences representation of this instance. The list is unmodifiable. If * the resulting String was already cached, a list with a single String entry will be returned.