Как проверить arg в varargs

1

У меня есть метод, который принимает varargs:

public static void main(String... args) throws Exception {

Я пытаюсь установить значение переменной на основе аргумента, переданного или нет. В этом случае, я хочу знать, был ли передан 8-й аргумент, и если так задано значение переменной для этого значения аргумента, в противном случае используйте пустую строку. Я не могу жестко закодировать в args [8] в логической части истинного результата, потому что это приводит к ошибке компиляции, когда она запускается только с 7 аргументами. Поэтому я попробовал следующее, но также и ошибки:

String titlePrefix = ((args.length!=8) ?  "" : args[args.length]);

Каков правильный способ проверить, был ли аргумент передан в этом случае и использовать его значение, только если оно было передано? Я знаю, что приведенное выше даст мне проблемы, если этот метод когда-либо превысит 8 аргументов, но пока давайте предположим, что у него никогда не будет больше 8.

Заранее спасибо.

  • 1
    тот факт, что вы заботитесь о «восьмом аргументе», подразумевает, что вы неправильно используете varargs. Если ваш метод должен делать разные вещи, основываясь на 7 или 8 аргументах, напишите два метода и назовите параметры вашего метода.
  • 1
    Это всегда будет выдавать ошибку, когда есть 8 аргументов. Это должно быть args[args.length - 1] .
Показать ещё 2 комментария
Теги:

3 ответа

1
Лучший ответ

args [args.length] должны быть args [args.length -1]

  • 0
    Спасибо! Вот и все. Я попытался отрегулировать нулевую базу, но по ошибке использовал args [args.length] -1) вместо ваших args [args.length -1]. Спасибо за хороший глаз.
1

Проверь это. Я думаю, это именно то, что вы ищете.

public class Test001 {

    public static void main(String... args) throws Exception {
        for (int i=0; i<8; i++){
            String val = args.length <= i ? "" : args[i];
            System.out.println("arg[" + i + "] = [" + val + "].");
        }
    }

}
  • 0
    Питер, спасибо, но для этого нужно пройтись по аргументам, что в моем случае не было необходимости. У меня был только один аргумент, который был необязательным, и который мне нужно было проверить. Спасибо.
  • 0
    О, хорошо ... Я просто дал вам более общее решение.
1
String titlePrefix = ((args == null || args.length<8) ?  "" : args[7]);

И почему?

Во-первых, вам может понадобиться 9-й или 10-й аргумент в будущем. Наличие 9 аргументов означает, что присутствует 8-й аргумент, поэтому вы должны проверить, есть ли у вас как минимум 8 аргументов, а не есть ли у вас ровно 8 аргументов.

Во-вторых, по той же причине вы не должны назначать последний аргумент, а точный 8-й аргумент. В конце концов, последним аргументом может быть 9-й или 10-й или 100-й.

Но даже если вы тестировали последний аргумент, помните, что массивы в Java (а varargs - просто замаскированный массив) начинаются с индекса 0 до индекса length-1. Первый аргумент - args[0], второй - args[1] а восьмой - args[7]. Таким образом, чтобы проверить последний аргумент, вы должны использовать args[args.length-1].

При работе с varargs обычно лучше всего также сначала проверить значение null (хотя, когда мы говорим об main методе, это, вероятно, не произойдет).

  • 0
    RealSkeptic, это тоже отличное решение (с использованием <8), но может привести к ошибке, если у меня будет менее 7 аргументов. В моем случае у меня всегда будет как минимум 7 аргументов, так что это не проблема. Но меня удивляет, как бы я это сделал, если бы аргументы 7 и 8 были необязательными?
  • 0
    Почему это вызвало бы ошибку, если у вас было менее 7 аргументов? Если у вас было менее 7 аргументов, он назначит "" titlePrefix . Почему это ошибка?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню