Печать наборов Java Хорошо (toString не возвращает симпатичный вывод),

Примечание: попытка получить свойство ошибки, отличной от объекта

Случается, когда вы пытаетесь получить доступ к объекту объекта, пока нет объекта.

Типичный пример для non-object notice будет

$users = json_decode('[{"name": "hakre"}]');
echo $users->name; # Notice: Trying to get property of non-object

В этом случае $users представляет собой массив (а не объект), и он не имеет никаких свойств.

Это похоже для доступа к несуществующему индексу или ключу массива (см. Примечание: Undefined Index ).

Этот пример значительно упрощен. Чаще всего такое уведомление сигнализирует неконтролируемое возвращаемое значение, например. когда библиотека возвращает NULL, если объект не существует или просто неожиданное значение, отличное от объекта (например, в результате Xpath, структуры JSON с непредвиденным форматом, XML с неожиданным форматом и т. д.), но код не проверяет такой условие.

Поскольку эти не-объекты часто обрабатываются дальше, часто возникает фатальная ошибка при вызове метода объекта для не-объекта (см.: Неустранимая ошибка: вызов члену function ... на не-объекте ), останавливая скрипт.

Его можно легко предотвратить, проверив условия ошибки и / или переменную, соответствующую ожиданию. Здесь такое уведомление с примером DOMXPath:

$result  = $xpath->query("//*[@id='detail-sections']/div[1]");
$divText = $result->item(0)->nodeValue; # Notice: Trying to get property of non-object

Проблема заключается в доступе к свойству nodeValue первого поля, пока он не был проверен, существует ли он или нет в $result коллекция. Вместо этого он платит, чтобы сделать код более явным, назначив переменные объектам, на которых работает код:

$result  = $xpath->query("//*[@id='detail-sections']/div[1]");
$div     = $result->item(0);
$divText = "-/-";
if ($div) {
    $divText = $div->nodeValue;
}
echo $divText;

Связанные ошибки:

204
задан Nathan 11 September 2015 в 08:44
поделиться

4 ответа

Вы могли преобразовать его в массив и затем распечатать это с Arrays.toString(Object[]):

System.out.println(Arrays.toString(stack.toArray()));
307
ответ дан Zach Langley 23 November 2019 в 04:54
поделиться

Если это - Ваш собственный класс набора, а не созданный в одном, необходимо переопределить его toString метод. Eclipse вызывает ту функцию для любых объектов, для которых это не имеет зашитого форматирования.

0
ответ дан Uri 23 November 2019 в 04:54
поделиться

Я соглашаюсь с вышеупомянутыми комментариями о переопределении toString() на Ваших собственных классах (и об автоматизации того процесса как можно больше).

Для классов Вы не сделали , определяют, Вы могли записать ToStringHelper класс с перегруженным методом для каждого класса библиотеки, который Вы хотите обработать к своим собственным вкусам:

public class ToStringHelper {
    //... instance configuration here (e.g. punctuation, etc.)
    public toString(List m) {
        // presentation of List content to your liking
    }
    public toString(Map m) {
        // presentation of Map content to your liking
    }
    public toString(Set m) {
        // presentation of Set content to your liking
    }
    //... etc.
}

РЕДАКТИРОВАНИЕ: Ответ на комментарий xukxpvfzflbbld, вот возможная реализация для случаев, упомянутых ранее.

package com.so.demos;

import java.util.List;
import java.util.Map;
import java.util.Set;

public class ToStringHelper {

    private String separator;
    private String arrow;

    public ToStringHelper(String separator, String arrow) {
        this.separator = separator;
        this.arrow = arrow;
    }

   public String toString(List<?> l) {
        StringBuilder sb = new StringBuilder("(");
        String sep = "";
        for (Object object : l) {
            sb.append(sep).append(object.toString());
            sep = separator;
        }
        return sb.append(")").toString();
    }

    public String toString(Map<?,?> m) {
        StringBuilder sb = new StringBuilder("[");
        String sep = "";
        for (Object object : m.keySet()) {
            sb.append(sep)
              .append(object.toString())
              .append(arrow)
              .append(m.get(object).toString());
            sep = separator;
        }
        return sb.append("]").toString();
    }

    public String toString(Set<?> s) {
        StringBuilder sb = new StringBuilder("{");
        String sep = "";
        for (Object object : s) {
            sb.append(sep).append(object.toString());
            sep = separator;
        }
        return sb.append("}").toString();
    }

}

Это не полноценная реализация, но просто начинающий.

9
ответ дан joel.neely 23 November 2019 в 04:54
поделиться

Реализуйте toString () на классе.

я рекомендую Apache палата общин ToStringBuilder сделать это легче. С ним просто необходимо записать этот вид метода:

public String toString() {
     return new ToStringBuilder(this).
       append("name", name).
       append("age", age).
       toString(); 
}

для получения этого вида вывода:

Person@7f54 [name=Stephen, age=29]

существует также отражающая реализация .

12
ответ дан Tim Kist 23 November 2019 в 04:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: