Я отправляю этот ответ, поэтому самый верхний ответ (при сортировке по активности) - это не тот, который просто ошибочен.
Что такое Stacktrace?
Stacktrace - это очень полезный инструмент отладки. Он показывает стек вызовов (значение, стек функций, которые были вызваны до этой точки) в то время, когда было выбрано неперехваченное исключение (или время, когда стек была создана вручную). Это очень полезно, потому что оно не только показывает вам, где произошла ошибка, но также и то, как программа оказалась в этом месте кода. Это приводит к следующему вопросу:
Что такое исключение?
Исключение - это то, что среда выполнения использует, чтобы сообщить вам, что произошла ошибка. Популярные примеры: NullPointerException, IndexOutOfBoundsException или ArithmeticException. Каждый из них вызывается, когда вы пытаетесь сделать что-то, что невозможно. Например, при попытке разыменовать Null-объект будет выбрано исключение NullPointerException:
Object a = null;
a.toString(); //this line throws a NullPointerException
Object[] b = new Object[5];
System.out.println(b[10]); //this line throws an IndexOutOfBoundsException,
//because b is only 5 elements long
int ia = 5;
int ib = 0;
ia = ia/ib; //this line throws an ArithmeticException with the
//message "/ by 0", because you are trying to
//divide by 0, which is not possible.
Как мне обращаться со Stacktraces / Exceptions?
Сначала выясните, что вызывает исключение. Попробуйте googleing имя исключения, чтобы узнать, в чем причина этого исключения. В большинстве случаев это будет вызвано неправильным кодом. В приведенных выше примерах все исключения вызваны неправильным кодом. Поэтому для примера NullPointerException вы можете убедиться, что a
никогда не является нулевым в то время. Например, вы можете инициализировать a
или включить проверку, подобную этой:
if (a!=null) {
a.toString();
}
Таким образом, строка нарушения не выполняется, если a==null
. То же самое касается других примеров.
Иногда вы не можете убедиться, что вы не получите исключения. Например, если вы используете сетевое соединение в своей программе, вы не можете остановить компьютер от потери его интернет-соединения (например, вы не можете запретить пользователю отключать сетевое подключение компьютера). В этом случае сетевая библиотека, вероятно, выбросит исключение. Теперь вы должны поймать исключение и обработать его. Это означает, что в примере с сетевым соединением вы должны попытаться снова открыть соединение или уведомить пользователя или что-то в этом роде. Кроме того, всякий раз, когда вы используете catch, всегда поймайте только исключение, которое вы хотите поймать, не используйте широко распространенные выписки, такие как catch (Exception e)
, которые поймают все исключения. Это очень важно, потому что в противном случае вы случайно поймаете неправильное исключение и отреагируете неверно.
try {
Socket x = new Socket("1.1.1.1", 6789);
x.getInputStream().read()
} catch (IOException e) {
System.err.println("Connection could not be established, please try again later!")
}
Почему я не должен использовать catch (Exception e)
?
Давайте использовать небольшой пример, чтобы показать, почему вы не должны просто перехватывать все исключения:
int mult(Integer a,Integer b) {
try {
int result = a/b
return result;
} catch (Exception e) {
System.err.println("Error: Division by zero!");
return 0;
}
}
Что этот код пытается сделать, так это поймать ArithmeticException
, вызванное возможным делением на 0. Но он также ловит возможно NullPointerException
, который выбрасывается, если a
или b
являются null
. Это означает, что вы можете получить NullPointerException
, но вы будете рассматривать его как исключение ArithmeticException и, вероятно, ошибаетесь. В лучшем случае вы все еще пропустите, что было исключение NullPointerException.
TLDR
catch (Exception e)
, всегда улавливайте определенные Исключения. Это избавит вас от многих головных болей. null && something
разрешается до null
.
Похоже, <Timeline>
не может принять null
в качестве props.children
. Попробуйте подготовить события перед рендерингом <Timeline>
:
let allEvents = [];
if (data) allEvents.push(/*something*/)
if (events) {
allEvents = allEvents.concat(events.map(/*something*/));
}
...
{allEvents.length > 0 && (
<Timeline>
{allEvents.map(event => <TimelineEvent/>)}
</Timeline>
)}
Может быть ошибка https://github.com/rcdexta/react-event-timeline/blob/master/components/Timeline. JS # L8
const childrenWithProps = React.Children.map(children, child => React.cloneElement(child, { orientation }))