Как мы можем распечатать номера строки к журналу в Java

Аргумент delegate в SliverList не обязательно является SliverChildListDelegate.

Вы также можете использовать SliverChildBuilderDelegate для достижения эффекта builder ListView.builder

SliverList(delegate: SliverChildBuilderDelegate((context, index) {
  return Container();
}));
.
128
задан Justin Bennett 22 September 2008 в 14:05
поделиться

8 ответов

Я рекомендовал бы использовать регистрирующийся инструментарий такой в качестве log4j. Вход настраивается через файлы свойств во времени выполнения, и можно включить / от функций, таких как номер строки / вход имени файла.

Рассмотрение javadoc для PatternLayout дает Вам полный список опций - что Вы, после %L.

6
ответ дан 24 November 2019 в 00:38
поделиться

Log4J позволяет Вам включать номер строки как часть его выходного шаблона. См. http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html для получения дополнительной информации о том, как сделать это (основной элемент в шаблоне преобразования является "L"). Однако Javadoc действительно включает следующее:

ПРЕДУПРЕЖДЕНИЕ, Генерирующее информацию о местоположении вызывающего абонента, является чрезвычайно медленным. Это - использование, должен избежаться, если скорость выполнения не является проблемой.

14
ответ дан 24 November 2019 в 00:38
поделиться

Код, отправленный @simon.buchan, будет работать...

Thread.currentThread().getStackTrace()[2].getLineNumber()

, Но если Вы называете его в методе, это будет всегда возвращаться, номер строки строки в методе поэтому скорее используют встроенный фрагмент кода.

7
ответ дан 24 November 2019 в 00:38
поделиться

Я вынужден ответить, не ответив на Ваш вопрос. Я предполагаю, что Вы ищете номер строки только для поддержки отладки. Существуют лучшие пути. Существуют hackish способы получить текущую строку. Все, что я видел, медленно. Вы - более обеспеченное использование платформы журналирования как этот в java.util.logging пакете или log4j. Используя эти пакеты можно настроить информацию о входе для включения контекста вниз в имя класса. Затем каждое сообщение журнала было бы достаточно уникально для знания, куда оно прибыло из. В результате Ваш код будет иметь переменную 'регистратора', которую Вы называете через

logger.debug("a really descriptive message")

вместо

System.out.println("a really descriptive message")

24
ответ дан 24 November 2019 в 00:38
поделиться

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

0
ответ дан 24 November 2019 в 00:38
поделиться

<забастовка> От Angsuman Chakraborty :

/** Get the current line number.
 * @return int - Current line number.
 */
public static int getLineNumber() {
    return Thread.currentThread().getStackTrace()[2].getLineNumber();
}
98
ответ дан 24 November 2019 в 00:38
поделиться

сначала общий метод (в служебном классе, в простом java1.4 кодируют, хотя, Вам, вероятно, придется переписать его для java1.5 и больше)

/**
 * Returns the first "[class#method(line)]: " of the first class not equal to "StackTraceUtils" and aclass. <br />
 * Allows to get past a certain class.
 * @param aclass class to get pass in the stack trace. If null, only try to get past StackTraceUtils. 
 * @return "[class#method(line)]: " (never empty, because if aclass is not found, returns first class past StackTraceUtils)
 */
public static String getClassMethodLine(final Class aclass)  {
    final StackTraceElement st = getCallingStackTraceElement(aclass);
    final String amsg = "[" + st.getClassName() + "#" + st.getMethodName() + "(" + st.getLineNumber()
    +")] <" + Thread.currentThread().getName() + ">: ";
    return amsg;
}

Затем определенный служебный метод получить право stackElement:

/**
   * Returns the first stack trace element of the first class not equal to "StackTraceUtils" or "LogUtils" and aClass. <br />
   * Stored in array of the callstack. <br />
   * Allows to get past a certain class.
   * @param aclass class to get pass in the stack trace. If null, only try to get past StackTraceUtils. 
   * @return stackTraceElement (never null, because if aClass is not found, returns first class past StackTraceUtils)
   * @throws AssertionFailedException if resulting statckTrace is null (RuntimeException)
   */
  public static StackTraceElement getCallingStackTraceElement(final Class aclass) {
    final Throwable           t         = new Throwable();
    final StackTraceElement[] ste       = t.getStackTrace();
    int index = 1;
    final int limit = ste.length;
    StackTraceElement   st        = ste[index];
    String              className = st.getClassName();
    boolean aclassfound = false;
    if(aclass == null) {
        aclassfound = true;
    }
    StackTraceElement   resst = null;
    while(index < limit) {
        if(shouldExamine(className, aclass) == true) {
            if(resst == null) {
                resst = st;
            }
            if(aclassfound == true) {
                final StackTraceElement ast = onClassfound(aclass, className, st);
                if(ast != null) {
                    resst = ast;
                    break;
                }
            }
            else
            {
                if(aclass != null && aclass.getName().equals(className) == true) {
                    aclassfound = true;
                }
            }
        }
        index = index + 1;
        st        = ste[index];
        className = st.getClassName();
    }
    if(isNull(resst))  {
        throw new AssertionFailedException(StackTraceUtils.getClassMethodLine() + " null argument:" + "stack trace should null"); //$NON-NLS-1$
    }
    return resst;
  }

  static private boolean shouldExamine(String className, Class aclass) {
      final boolean res = StackTraceUtils.class.getName().equals(className) == false && (className.endsWith(LOG_UTILS
        ) == false || (aclass !=null && aclass.getName().endsWith(LOG_UTILS)));
      return res;
  }

  static private StackTraceElement onClassfound(Class aclass, String className, StackTraceElement st) {
      StackTraceElement   resst = null;
      if(aclass != null && aclass.getName().equals(className) == false)
      {
          resst = st;
      }
      if(aclass == null)
      {
          resst = st;
      }
      return resst;
  }
0
ответ дан 24 November 2019 в 00:38
поделиться

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

Вы хотели бы смотреть на обогащение исключения как на технику для улучшения обработки исключений http://tutorials.jenkov.com/java-exception-handling/exception-enrichment.html

0
ответ дан 24 November 2019 в 00:38
поделиться
Другие вопросы по тегам:

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