Как расширить Java Socket [дубликат]

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

Для каждого вызова Python sys.argv автоматически представляет список строк, представляющих аргументы ( как разделенные пробелами) в командной строке. Имя происходит из соглашения C программирования , в котором argv и argc представляют аргументы командной строки.

Вы хотите узнать больше о списках и строках, когда вы знакомы с Python, но в то же время, вот несколько вещей, которые нужно знать.

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

  из __future__ import print_function import sys print (sys.argv, len (sys.argv  ))  

Для сценария требуется Python 2.6 или новее. Если вы вызываете этот скрипт print_args.py , вы можете вызвать его с разными аргументами, чтобы узнать, что происходит.

  & gt;  python print_args.py ['print_args.py'] 1 & gt;  python print_args.py foo и bar ['print_args.py', 'foo', 'and', 'bar'] 4 & gt;  python print_args.py "foo and bar" ['print_args.py', 'foo and bar'] 2 & gt;  python print_args.py «foo and bar» и baz ['print_args.py', 'foo and bar', 'and', 'baz'] 4  

Как вы можете видеть, аргументы командной строки включают имя сценария, но не имя интерпретатора. В этом смысле Python рассматривает сценарий как исполняемый файл. Если вам нужно знать имя исполняемого файла (в этом случае python), вы можете использовать sys.executable .

Вы можете видеть из примеров, которые можно получить аргументы, которые содержат пробелы, если пользователь вызывал скрипт с аргументами, заключенными в кавычки, так что вы получаете список аргументов, предоставленных пользователем.

Теперь в вашем коде Python вы можете использовать этот список строк в качестве вклада в вашу программу. Поскольку списки индексируются нулевыми целыми числами, вы можете получить отдельные элементы, используя синтаксис списка [0]. Например, чтобы получить имя скрипта:

  script_name = sys.argv [0] # это всегда будет работать.   

Хотя вам интересно, вам редко нужно знать имя вашего скрипта. Чтобы получить первый аргумент после скрипта для имени файла, вы можете сделать следующее:

  filename = sys.argv [1]  

Это очень частое использование, но обратите внимание, что он не сгенерирован с помощью IndexError, если аргумент не был предоставлен.

Кроме того, Python позволяет ссылаться на фрагмент списка, поэтому, чтобы получить другой список из аргументов, предоставленных пользователем (но без имени сценария), вы можете сделать

  user_args = sys.argv [1:] # получить все после имени скрипта  

Кроме того, Python позволяет назначать последовательность элементов (включая списки) именам переменных. Поэтому, если вы ожидаете, что пользователь всегда будет поставлять два аргумента, вы можете назначить эти аргументы (как строки) двум переменным:

  user_args = sys.argv [1:] fun, games = user_args #  len (user_args) лучше 2  

Итак, чтобы ответить на ваш конкретный вопрос, sys.argv [1] представляет первый аргумент командной строки (как string ), поставленный в рассматриваемый скрипт. Он не будет запрашивать ввод, но он будет терпеть неудачу с IndexError, если в командной строке после имени сценария не указаны аргументы.

0
задан ItsNotAboutTheName 24 July 2013 в 10:33
поделиться

2 ответа

Просто добавьте броски MalformedURLException в конструктор загрузчика и код переноса в основном методе с блоком catch try.

public class loader extends URLClassLoader {

    public static void main(String[] args) throws Exception {
        try {
            Object localObject = new loader(loader.class.getClassLoader(),
                    new File(loader.class.getProtectionDomain().getCodeSource()
                            .getLocation().getPath()));
        } catch (MalformedURLException e) {
            // ..
        }
    }

    private loader(ClassLoader paramClassLoader, File paramFile)
            throws MalformedURLException {
        super(new URL[] { paramFile.toURI().toURL() }, paramClassLoader);

        if (paramClassLoader == null) {
            throw new IllegalArgumentException("Error loading class");
        }
    }
}
3
ответ дан Shashi 16 August 2018 в 00:55
поделиться
  • 1
    Спасибо, это сработало. Я пробовал что-то подобное (а это не так), поэтому я не видел просто добавить оба (try-catch and throws). Задача решена. – CFP 24 July 2013 в 12:42

Исключение фактически не вызывается конструктором суперкласса; он (или, по крайней мере, объявляется потенциально брошенным), вызывается URI.toURL(), который вы вызываете в свой аргумент в конструктор суперкласса.

Один из вариантов - написать статический метод для преобразования этого исключения в непроверенный:

private static URL convertFileToURL(File file) {
    try {
        return file.toURI().toURL();
    } catch (MalformedURLException e) {
        throw new RuntimeException("Unable to convert file to URL", e);
    }
}

Затем:

private loader(ClassLoader paramClassLoader, File paramFile){   
    super(new URL[] { convertFileToURL(paramFile) }, paramClassLoader);

    if (paramClassLoader == null)
        throw new IllegalArgumentException("Error loading class");
}

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

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

В качестве стороннего, пожалуйста, переименуйте свой класс в что-то более значимое, которое следует за соглашениями об именах Java.

7
ответ дан Jon Skeet 16 August 2018 в 00:55
поделиться
  • 1
    Спасибо за ваше объяснение. – CFP 24 July 2013 в 12:38
  • 2
    @PKKG: Пожалуйста, не добавляйте ссылки на абсолютно не связанные с ними сообщения в виде комментариев. – Jon Skeet 24 July 2013 в 13:34
Другие вопросы по тегам:

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