Java: найти имя программы, анализировать целочисленный аргумент - PullRequest
5 голосов
/ 15 июля 2011

Простой тестовый пример, демонстрирующий мои 2 проблемы:

public class Numbers {

    private static void usage() {
        System.err.println("Usage: java " + getClass().getName() + " range");
        System.exit(1);
    }

    public static void main(String[] args) throws IOException {
        try {
            int range = Integer.parseInt(args[0]);
        } catch (Exception e) {
            usage();
        }
    }
}
  1. Невозможно вызвать getClass() из статического метода
  2. Если аргументы не были предоставлены вВ командной строке я получу сообщение ArrayIndexOutOfBoundsException вместо вывода usage().Почему не ловит (исключение e) ловит его?

Ответы [ 7 ]

6 голосов
/ 15 июля 2011

1) getClass - это метод для типа Object.В статических методах нет объекта для вызова getClass на

2) Исключение поймано в вашем примере - я только что протестировал его.

3 голосов
/ 15 июля 2011

У меня работает, исключение ловится.

Получить имя класса из статического метода без ссылки на Numbers.class.getName() сложно.

Но я нашел это

String className = Thread.currentThread().getStackTrace()[2].getClassName(); 
System.err.println("Usage: java " + className + " range");
1 голос
/ 15 июля 2011

Вы не можете использовать метод getClass () без ссылочного объекта.

Попробуйте это

System.err.println("Usage: java " + Numbers.class.getName() + " range");

Невозможно использовать переменную / метод-член без ссылки на объект из статического метода.

int range = Integer.parseInt(args[0]);

Выше будет возвращено ArrayIndexOutOfBoundException, а не IOException.

Так что ваш код не будет компилироваться.

1 голос
/ 15 июля 2011

На ваш первый вопрос можно ответить, посмотрев на этот вопрос: Получение имени класса из статического метода в Java .

1 голос
/ 15 июля 2011

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

StackTraceElement[] stackTraceElements= new Exception().getStackTrace();
String className = stackTraceElements[0].getClassName();
0 голосов
/ 15 июля 2011

Чтобы получить класс, вы можете сделать одну из двух вещей:

Class cl = null;
try
{
    cl = Class.forName("Numbers");
}
catch(ClassNotFoundException ex)
{
}

или:

Numbers n = new Numbers();
Class cl = n.getClass();

Первое очевидно лучше, потому что вы не тратите впустую память.Хотя, если вы просто планируете вернуться прямо сейчас, в этом случае это, вероятно, не имеет большого значения.

0 голосов
/ 15 июля 2011

Если вы создаете новый экземпляр Numbers, вы можете позвонить по этому номеру getClass().

(new Numbers()).getClass().getName()

и, как уже сказал @Petar Ivanov, исключение получено, как и ожидалось.

...