Как мы можем напечатать номера строк в журнал в Java - PullRequest
126 голосов
/ 22 сентября 2008

Как напечатать номера строк в журнал. Скажем, при выводе некоторой информации в журнал, я также хочу напечатать номер строки, где этот вывод находится в исходном коде. Как мы видим из трассировки стека, он отображает номер строки, где произошло исключение. Трассировка стека доступна для объекта исключения.

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

Ответы [ 19 ]

0 голосов
/ 14 июля 2015

вы можете использовать -> Reporter.log ("");

0 голосов
/ 30 мая 2013

Все они дают вам номера строк вашего текущего потока и метода, которые отлично работают, если вы используете попытку try, где вы ожидаете исключения. Но если вы хотите перехватить любое необработанное исключение, тогда вы используете обработчик необработанных исключений по умолчанию, и текущий поток вернет номер строки функции-обработчика, а не метод класса, вызвавший исключение. Вместо использования Thread.currentThread () просто используйте Throwable, переданный обработчиком исключения:

Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
            public void uncaughtException(Thread t, Throwable e) {              
                if(fShowUncaughtMessage(e,t))               
                    System.exit(1);
            }
        });

В приведенном выше примере используйте e.getStackTrace () [0] в функции обработчика (fShowUncaughtMessage), чтобы получить нарушителя.

0 голосов
/ 23 апреля 2013

По-моему, у меня все работает

String str = "select os.name from os where os.idos="+nameid;  try {
        PreparedStatement stmt = conn.prepareStatement(str);
        ResultSet rs = stmt.executeQuery();
        if (rs.next()) {
            a = rs.getString("os.n1ame");//<<<----Here is the ERROR          
        }
        stmt.close();
  } catch (SQLException e) {
        System.out.println("error line : " + e.getStackTrace()[2].getLineNumber());            
        return a;
  }
0 голосов
/ 14 января 2013
private static final int CLIENT_CODE_STACK_INDEX;

static {
    // Finds out the index of "this code" in the returned stack Trace - funny but it differs in JDK 1.5 and 1.6
    int i = 0;
    for (StackTraceElement ste : Thread.currentThread().getStackTrace()) {
        i++;
        if (ste.getClassName().equals(Trace.class.getName())) {
            break;
        }
    }
    CLIENT_CODE_STACK_INDEX = i;
}

private String methodName() {
    StackTraceElement ste=Thread.currentThread().getStackTrace()[CLIENT_CODE_STACK_INDEX+1];
    return ste.getMethodName()+":"+ste.getLineNumber();
}
0 голосов
/ 12 июня 2012

Посмотрите на эту ссылку . В этом методе вы можете перейти к строковому коду, когда вы дважды щелкнете по строке LogCat.

Также вы можете использовать этот код для получения номера строки:

public static int getLineNumber()
{
    int lineNumber = 0;
    StackTraceElement[] stackTraceElement = Thread.currentThread()
            .getStackTrace();
    int currentIndex = -1;
    for (int i = 0; i < stackTraceElement.length; i++) {
        if (stackTraceElement[i].getMethodName().compareTo("getLineNumber") == 0)
        {
            currentIndex = i + 1;
            break;
        }
    }

    lineNumber = stackTraceElement[currentIndex].getLineNumber();

    return lineNumber;
}
0 голосов
/ 18 августа 2011

Вот регистратор, который мы используем.

оборачивается вокруг Android Logger и отображает имя класса, имя метода и номер строки.

http://www.hautelooktech.com/2011/08/15/android-logging/

0 голосов
/ 22 сентября 2008

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

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

0 голосов
/ 22 сентября 2008

сначала общий метод (в служебном классе, в простом старом коде 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;
}

Тогда конкретный служебный метод для получения нужного стекаElement:

/**
   * 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 голосов
/ 22 сентября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...