Можем ли мы получить LineNumber и ColumnNumber в блоке try, в котором произошло исключение

У меня есть код ниже, с которым я могу напечатать полное имя класса, имя_файла, имя метода, при котором произошла ошибка.

Кроме того, я могу напечатать номер строки, но напечатанный номер строки - это строка, в которой инициализируется переменная «LineNumber».

Как я могу напечатать точный номер строки и столбца в блоке try, в котором произошла ошибка?

try
{
    SQL Query
}
catch(Exception e)
{
   String fullClassName = Thread.currentThread().getStackTrace()[1].getClassName();              
   String className = fullClassName.substring(fullClassName.lastIndexOf(".") + 1);  
   String methodName = Thread.currentThread().getStackTrace()[1].getMethodName();  
   int lineNumber = Thread.currentThread().getStackTrace()[1].getLineNumber();  

     JOptionPane.showMessageDialog(null,fullClassName+"--"+className+"--"+methodName+"--"+lineNumber,"Error In Moving data from table1 to table2",JOptionPane.ERROR_MESSAGE);                         

}

Ouput:

  IPM.Shifting--Shifting--ConfirmTransfer_BActionPerformed--1138
7
Я попробовал, но не получил требуемый результат. Выход: [Ljava.lang.StackTraceElement; @ fa39d7 @Fildor
добавлено автор Akki, источник
Вы пробовали e.getStacktrace вместо Thread.currentThread (). GetStackTrace ?
добавлено автор Fildor, источник

5 ответы

public class ExceptionHandler {

    /**
     * @param args
     */
    public static void main(String[] args) {

        try {
            String str = getString();
            if(str.isEmpty()){
                System.out.println("error");
            }
        } catch (Exception e) {
            StackTraceElement[] elements = e.getStackTrace();  
            for (int iterator=1; iterator<=elements.length; iterator++)  
                   System.out.println("Class Name:"+elements[iterator-1].getClassName()+" Method Name:"+elements[iterator-1].getMethodName()+" Line Number:"+elements[iterator-1].getLineNumber());
        }
    }

    private static String getString() {
        jhgfjkhgjh();
        return null;
    }

    private static void jhgfjkhgjh() {
        gfdhdfghdg();
    }

    private static void gfdhdfghdg() {
        sdfytusdgsfd();
    }

    private static void sdfytusdgsfd() {
        throw null;
    }



}
3
добавлено
он работает как шарм
добавлено автор jalpa, источник
StackTraceElement[] stackTrace = Thread.currentThread()
                    .getStackTrace();
String fullClassName = stackTrace[stackTrace.length-1].getClassName();
String className = fullClassName.substring(fullClassName
        .lastIndexOf(".") + 1);
String methodName = stackTrace[stackTrace.length-1].getMethodName();
int lineNumber = stackTrace[stackTrace.length-1].getLineNumber();
2
добавлено
Это не работает. Вывод java.awt.EventDispatchThread - EventDispatchThread - run - 122. Мой блок try начинается с LineNumber: 1074 и заканчивается в LineNumber: 1131 @Quoi
добавлено автор Akki, источник
Как мне отредактировать это, чтобы получить номер строки, на которой возникает ошибка внутри блока try @Peter Lawrey
добавлено автор Akki, источник
Это не работает. Он дает номер строки, в которой инициализируется переменная lineNumber @Peter Lawrey
добавлено автор Akki, источник
@peterLawrey Невозможно получить LineNumber и ColumnNumber в блоке try, в котором произошло исключение
добавлено автор Akki, источник
Трассировка стека сначала указана в верхней части стека.
добавлено автор Peter Lawrey, источник
@Akki int lineNumber = stackTrace [1] .getLineNumber;
добавлено автор Peter Lawrey, источник
Если вы хотите напечатать строку, в которой произошло исключение, вы посмотрите на исключение или, что более нормально, просто распечатайте трассировку стека, чтобы вы могли понять, почему произошла ошибка.
добавлено автор Peter Lawrey, источник
Это в Исключении, и именно поэтому это то, что обычно печатается. Если вы хотите свести его к одной строке (это не очень хорошая идея ИМХО), вам нужно выполнить поиск по ней, чтобы найти один из того же метода.
добавлено автор Peter Lawrey, источник
@Akki может быть, это поможет вам e.getStackTrace() [0] .getLineNumber (), чтобы найти точный номер строки исключения, где e - объект исключения.
добавлено автор ritesh9984, источник
} catch (Exception e) {            
        StackTraceElement[] stackTrace = e.getStackTrace();             
        String fullClassName = stackTrace[stackTrace.length - 1].getClassName();
        String className = fullClassName.substring(fullClassName
                .lastIndexOf(".") + 1);
        String methodName = stackTrace[stackTrace.length - 1].getMethodName();
        int lineNumber = stackTrace[stackTrace.length - 1].getLineNumber();
        JOptionPane.showMessageDialog(null, fullClassName + "--" + className + "--" + methodName + "--" + lineNumber, "Error In Moving data from table1 to table2", JOptionPane.ERROR_MESSAGE);
    }
2
добавлено
Вместо того, чтобы публиковать только ответ, почему бы не добавить объяснение того, что было не так и почему?
добавлено автор Adam, источник

Вы также можете попробовать

JOptionPane.showMessageDialog(null, ""+Thread.currentThread().getStackTrace()[1]);

например

System.out.println(Thread.currentThread().getStackTrace()[1]);

печать

Main.main(Main.java:32)
1
добавлено

Здесь я решил, что это поможет вам.

public class TestApp{

    public static void main(String...strings){
        try{
             int num1=30, num2=0;
             int output=num1/num2;
             System.out.println ("Result: "+output);
          }
          catch(Exception e){

              ExceptionHandleCenter.throwException(e,
                      Thread.currentThread().getStackTrace()[1].getClassName(),
                      Thread.currentThread().getStackTrace()[1].getMethodName(),
                      e.getStackTrace()[0].getLineNumber());
          }
    }
}

class ExceptionHandleCenter {

    public static void throwException(Exception e, String fullClassName, String methodName,int lineNumber){

        String info = fullClassName+" method "+methodName+" at line "+lineNumber;

        if(e.getClass().equals(ArithmeticException.class)){
             System.err.println("Airthmetic exception. occurred In "+info);
         }
        if(e.getClass().equals(IllegalArgumentException.class)){
             System.err.println("Provided Argument is illegal.occurred In "+info);
         }
        if(e.getClass().equals(NumberFormatException.class)){
             System.err.println("Number Format Exception. occurred In "+info);
         }
    }
}
0
добавлено
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async