query () в поставщике контента [дубликат]

Более гибкое решение для создания элементов и связывания событий ( source )

// creating a dynamic element (container div)
var $div = $("
", {id: 'myid1', class: 'myclass'}); //creating a dynamic button var $btn = $("

Примечание. Это создаст экземпляр обработчика события для каждого элемента (может повлиять на производительность при использовании в петлях)

539
задан Taryn 22 March 2017 в 17:16
поделиться

7 ответов

Простыми словами, трассировка стека представляет собой список вызовов методов, которые приложение находилось в середине того момента, когда было выбрано исключение.

Простой пример

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

Exception in thread "main" java.lang.NullPointerException
        at com.example.myproject.Book.getTitle(Book.java:16)
        at com.example.myproject.Author.getBookTitles(Author.java:25)
        at com.example.myproject.Bootstrap.main(Bootstrap.java:14)

Это очень простая трассировка стека. Если мы начнем с начала списка «at ...», мы можем определить, где произошла наша ошибка. Мы ищем самый верхний вызов метода, который является частью нашего приложения. В этом случае это:

at com.example.myproject.Book.getTitle(Book.java:16)

Чтобы отладить это, мы можем открыть Book.java и посмотреть на строку 16, которая:

15   public String getTitle() {
16      System.out.println(title.toString());
17      return title;
18   }

Это указывают, что что-то (возможно title) является null в приведенном выше коде.

Пример с цепочкой исключений

Иногда приложения захватывают Исключение и повторно бросают его как причина другого Исключения. Обычно это выглядит так:

34   public void getBookIds(int id) {
35      try {
36         book.getId(id);    // this method it throws a NullPointerException on line 22
37      } catch (NullPointerException e) {
38         throw new IllegalStateException("A book has a null property", e)
39      }
40   }

Это может дать вам трассировку стека, которая выглядит следующим образом:

Exception in thread "main" java.lang.IllegalStateException: A book has a null property
        at com.example.myproject.Author.getBookIds(Author.java:38)
        at com.example.myproject.Bootstrap.main(Bootstrap.java:14)
Caused by: java.lang.NullPointerException
        at com.example.myproject.Book.getId(Book.java:22)
        at com.example.myproject.Author.getBookIds(Author.java:36)
        ... 1 more

В этом отличие от «Причиненный». Иногда исключения будут иметь несколько разделов «Causeed by». Для этого вам обычно требуется найти «первопричину», которая будет одной из самых низких разделов «Причиненные» в трассировке стека. В нашем случае это:

Caused by: java.lang.NullPointerException <-- root cause
        at com.example.myproject.Book.getId(Book.java:22) <-- important line

Опять же, с этим исключением мы хотели бы посмотреть строку 22 в Book.java, чтобы увидеть, что может вызвать здесь NullPointerException.

Более сложный пример с библиотечным кодом

Обычно трассировки стека намного сложнее, чем два приведенных выше примера. Вот пример (он длинный, но демонстрирует несколько уровней связанных исключений):

javax.servlet.ServletException: Something bad happened
    at com.example.myproject.OpenSessionInViewFilter.doFilter(OpenSessionInViewFilter.java:60)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.example.myproject.ExceptionHandlerFilter.doFilter(ExceptionHandlerFilter.java:28)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.example.myproject.OutputBufferFilter.doFilter(OutputBufferFilter.java:33)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.Server.handle(Server.java:326)
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
    at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:943)
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:756)
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218)
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
    at org.mortbay.jetty.bio.SocketConnector$Connection.run(SocketConnector.java:228)
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
Caused by: com.example.myproject.MyProjectServletException
    at com.example.myproject.MyServlet.doPost(MyServlet.java:169)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
    at com.example.myproject.OpenSessionInViewFilter.doFilter(OpenSessionInViewFilter.java:30)
    ... 27 more
Caused by: org.hibernate.exception.ConstraintViolationException: could not insert: [com.example.myproject.MyEntity]
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:96)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
    at org.hibernate.id.insert.AbstractSelectingDelegate.performInsert(AbstractSelectingDelegate.java:64)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2329)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2822)
    at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:71)
    at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:268)
    at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:321)
    at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:204)
    at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:130)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)
    at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:56)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)
    at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:50)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
    at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:705)
    at org.hibernate.impl.SessionImpl.save(SessionImpl.java:693)
    at org.hibernate.impl.SessionImpl.save(SessionImpl.java:689)
    at sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:344)
    at $Proxy19.save(Unknown Source)
    at com.example.myproject.MyEntityService.save(MyEntityService.java:59) <-- relevant call (see notes below)
    at com.example.myproject.MyServlet.doPost(MyServlet.java:164)
    ... 32 more
Caused by: java.sql.SQLException: Violation of unique constraint MY_ENTITY_UK_1: duplicate value(s) for column(s) MY_COLUMN in statement [...]
    at org.hsqldb.jdbc.Util.throwError(Unknown Source)
    at org.hsqldb.jdbc.jdbcPreparedStatement.executeUpdate(Unknown Source)
    at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeUpdate(NewProxyPreparedStatement.java:105)
    at org.hibernate.id.insert.AbstractSelectingDelegate.performInsert(AbstractSelectingDelegate.java:57)
    ... 54 more

В этом примере есть намного больше. В основном нас беспокоит поиск методов из нашего кода , который был бы любым в пакете com.example.myproject. Из второго примера (см. Выше) мы сначала хотели бы посмотреть на основную причину:

Caused by: java.sql.SQLException

Однако все вызовы методов под этим являются библиотечным кодом. Поэтому мы перейдем к «Причиненному» над ним и рассмотрим первый вызов метода, исходящий из нашего кода, который есть:

at com.example.myproject.MyEntityService.save(MyEntityService.java:59)

Как и в предыдущих примерах, мы должны посмотреть на MyEntityService.java в строке 59, потому что именно здесь возникла эта ошибка (это немного очевидно, что пошло не так, поскольку SQLException указывает на ошибку, но процедура отладки - это то, что мы делаем).

481
ответ дан Gray 17 August 2018 в 21:59
поделиться
  • 1
    Вы не объяснили, что в stacktrace есть несколько основных причин. – Buhake Sindi 21 October 2010 в 17:15
  • 2
    @ The Elite Gentleman - Ну, в конечном счете, есть только одна причина, нет? Нижняя часть "Caused by & quot; будет корень. Вероятно, я мог бы получить трассировку с несколькими причинами " цепочки. Я посмотрю что я могу сделать. – Rob Hruska 21 October 2010 в 17:26
  • 3
    @Rob Hruska, извините, я имел в виду, что у вас потенциально может быть более 1 & quot; Caused By & quot; в стеке. – Buhake Sindi 21 October 2010 в 17:33
  • 4
    @ The Elite Gentleman - Нет проблем - я все равно обновил свой пример, надеюсь, это поможет. – Rob Hruska 21 October 2010 в 17:43
  • 5
    Также добавлен java 1.7 «Подавлен: & quot; - который перечисляет подавленные исключения стека стека перед отображением "Caused by: & quot; для этого исключения. Он автоматически используется конструкцией try-with-resource: docs.oracle.com/javase/specs/jls/se8/html/… и содержит исключения, если они были выбраны во время ресурса (ов) закрытие. – dhblah 1 July 2015 в 13:48

Я отправляю этот ответ, поэтому самый верхний ответ (при сортировке по активности) - это не тот, который просто ошибочен.

Что такое 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

  1. Выясните, в чем причина исключения, и исправьте его, чтобы он не делал этого. 't исключение вообще.
  2. Если 1. невозможно, поймайте конкретное исключение и обработайте его. Никогда не добавляйте try / catch, а затем просто игнорируйте исключение! Не делай этого! Никогда не используйте catch (Exception e), всегда улавливайте определенные Исключения. Это избавит вас от многих головных болей.
65
ответ дан Dakkaron 17 August 2018 в 21:59
поделиться
  • 1
    Спасибо, это действительно полезный ответ. Пожалуйста, вы можете исправить опечатку: «попробуйте почтить Null-объект». (Вам нужны исправления для редактирования сообщения, если вы не являетесь автором) – Zach Smith 19 January 2016 в 09:27
  • 2
    Спасибо за ответ и опечатку;) – Dakkaron 19 January 2016 в 10:30
  • 3
    @Dakkaron: Отличный ответ, спасибо! Я полагаю, что ia = ia / b; должно быть ia = ia / ib ;? – Setily 9 September 2016 в 12:53
  • 4
    Хорошее объяснение того, почему мы должны избегать маскировки ошибок – Sudip Bhandari 20 December 2016 в 11:07
  • 5
  • 6
    То, что я имел в виду, теперь было удалено, насколько я знаю. Он в основном сказал «просто положил try {} catch (исключение e) {} и проигнорировал все ошибки & quot ;. Принятый ответ намного старше моего ответа, поэтому я хотел немного поразмышлять над этим вопросом. Я не думаю, что это помогает кому-то просто скопировать чужой ответ или покрыть то, что другие люди уже хорошо накрывают. – Dakkaron 6 February 2017 в 17:43
  • 7
  • 8
    – Dakkaron 8 March 2017 в 15:17

Чтобы добавить к другим примерам, есть внутренние (вложенные) классы, которые появляются с знаком $. Например:

public class Test {

    private static void privateMethod() {
        throw new RuntimeException();
    }

    public static void main(String[] args) throws Exception {
        Runnable runnable = new Runnable() {
            @Override public void run() {
                privateMethod();
            }
        };
        runnable.run();
    }
}

приведет к этой трассировке стека:

Exception in thread "main" java.lang.RuntimeException
        at Test.privateMethod(Test.java:4)
        at Test.access$000(Test.java:1)
        at Test$1.run(Test.java:10)
        at Test.main(Test.java:13)
8
ответ дан Eugene S 17 August 2018 в 21:59
поделиться

Чтобы понять имя: трассировка стека представляет собой список исключений (или вы можете сказать список «Причина от»), от самого поверхностного исключения (например, исключение уровня обслуживания) до самого глубокого (например, исключения базы данных) , Точно так же, как причина, которую мы называем «стеком», состоит в том, что стек - это First in Last out (FILO), самое глубокое исключение произошло в самом начале, затем цепочка исключений была сгенерирована серией последствий, поверхность Exception была последней один из них произошел вовремя, но мы его видим в первую очередь.

Ключ 1: Трудная и важная вещь здесь должна быть понята: самая глубокая причина не может быть «первопричиной», потому что если вы пишете «плохой код», это может вызвать некоторое исключение, которое находится ниже уровня его. Например, плохой sql-запрос может вызвать сброс соединения SQLServerException в кубе вместо ошибки синфакса, которая может находиться только в середине стека.

-> Определить основную причину в середине - это ваша задача.

Ключ 2: Еще одна сложная, но важная вещь находится внутри каждого блока «Причина», первая строка была самым глубоким слоем и первым местом для этого блока. Например,

Exception in thread "main" java.lang.NullPointerException
        at com.example.myproject.Book.getTitle(Book.java:16)
           at com.example.myproject.Author.getBookTitles(Author.java:25)
               at com.example.myproject.Bootstrap.main(Bootstrap.java:14)

Book.java:16 был вызван Auther.java:25, который был вызван Bootstrap.java:14, Book.java:16 был основной причиной. Здесь прикрепите диаграмму сортировки стека следов в хронологическом порядке.

11
ответ дан Kevin Li 17 August 2018 в 21:59
поделиться

Существует еще одна функция stacktrace, предлагаемая семейством Throwable - возможность управлять информацией о трассировке стека.

Стандартное поведение:

package test.stack.trace;

public class SomeClass {

    public void methodA() {
        methodB();
    }

    public void methodB() {
        methodC();
    }

    public void methodC() {
        throw new RuntimeException();
    }

    public static void main(String[] args) {
        new SomeClass().methodA();
    }
}

Трассировка стека:

Exception in thread "main" java.lang.RuntimeException
    at test.stack.trace.SomeClass.methodC(SomeClass.java:18)
    at test.stack.trace.SomeClass.methodB(SomeClass.java:13)
    at test.stack.trace.SomeClass.methodA(SomeClass.java:9)
    at test.stack.trace.SomeClass.main(SomeClass.java:27)

Манипулированная трассировка стека:

package test.stack.trace;

public class SomeClass {

    ...

    public void methodC() {
        RuntimeException e = new RuntimeException();
        e.setStackTrace(new StackTraceElement[]{
                new StackTraceElement("OtherClass", "methodX", "String.java", 99),
                new StackTraceElement("OtherClass", "methodY", "String.java", 55)
        });
        throw e;
    }

    public static void main(String[] args) {
        new SomeClass().methodA();
    }
}

Трассировка стека:

Exception in thread "main" java.lang.RuntimeException
    at OtherClass.methodX(String.java:99)
    at OtherClass.methodY(String.java:55)
14
ответ дан przemek hertel 17 August 2018 в 21:59
поделиться

Другие сообщения описывают, что такое трассировка стека, но с ней все еще сложно работать.

Если вы получаете трассировку стека и хотите проследить причину исключения, хорошая начальная точка понимая, что использовать Java Stack Trace Console в Eclipse. Если вы используете другую среду IDE, может быть аналогичная функция, но этот ответ касается Eclipse.

Во-первых, убедитесь, что все ваши источники Java доступны в проекте Eclipse.

Затем в перспективе Java щелкните вкладку Console (обычно внизу). Если вид консоли не отображается, перейдите в пункт меню Окно -> Показать вид и выберите Консоль .

Затем в окне консоли нажмите на следующей кнопке (справа)

Consoles button [/g8]

, а затем выберите Java Stack Trace Console из раскрывающегося списка.

Вставьте трассировку стека в консоль. Затем он предоставит список ссылок в ваш исходный код и любой другой исходный код.

Это то, что вы можете увидеть (изображение из документации Eclipse):

Diagram from Eclipse documentation [/g9]

Самым последним вызовом метода будет верхняя вершина стека, которая является верхней строкой (исключая текст сообщения). Спуск по стопе идет назад во времени. Вторая строка - это метод, который вызывает первую строку и т. Д.

Если вы используете программное обеспечение с открытым исходным кодом, вам может потребоваться загрузить и прикрепить к проекту источники, если вы хотите их изучить. Загрузите исходные банки в своем проекте, откройте папку Referenced Libraries , чтобы найти свою банку для вашего модуля с открытым исходным кодом (тот, который имеет файлы классов), затем щелкните правой кнопкой мыши, выберите Свойства и присоедините исходную банку.

5
ответ дан rghome 17 August 2018 в 21:59
поделиться

Чтобы добавить к тому, что упомянул Роб. Настройка точек останова в вашем приложении позволяет поэтапно обрабатывать стек. Это позволяет разработчику использовать отладчик, чтобы увидеть, в какой точной точке метод делает что-то непредвиденное.

Так как Rob использовал NullPointerException (NPE), чтобы проиллюстрировать что-то общее, мы можем помочь удалите эту проблему следующим образом:

, если у нас есть метод, который принимает такие параметры, как: void (String firstName)

. В нашем коде мы хотели бы оценить, что firstName содержит значение, мы сделали бы это так: if(firstName == null || firstName.equals("")) return;

Вышеупомянутое не позволяет нам использовать firstName как небезопасный параметр. Поэтому, выполняя нулевые проверки перед обработкой, мы можем помочь обеспечить правильность работы нашего кода. Чтобы расширить пример, который использует объект с помощью методов, мы можем посмотреть здесь:

if(dog == null || dog.firstName == null) return;

Выше был правильный порядок проверки нулей, мы начинаем с базового объекта , собака в этом случае, а затем начните спускаться по дереву возможностей, чтобы убедиться, что все будет действовать до обработки. Если бы порядок был отменен, NPE потенциально может быть выброшен, и наша программа потерпит крах.

18
ответ дан Sai Kishore 17 August 2018 в 21:59
поделиться
  • 1
    Согласовано. Этот подход можно было бы использовать, чтобы выяснить, какая ссылка в выражении null, когда проверяется NullPointerException, например. – Rob Hruska 21 October 2010 в 16:07
  • 2
    Когда вы работаете с String, если вы хотите использовать метод equals, я думаю, что лучше использовать константу в левой части сравнения, например: Вместо: if (firstName == null || firstName.equals (& quot; «))); Я всегда использую: if ((«& quot;)) равно (firstName)) Это предотвращает исключение Nullpointer – Torres 26 October 2010 в 07:23
Другие вопросы по тегам:

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