Java: verifique se os argumentos da linha de comando são nulos

89

Estou procurando fazer uma verificação de erros para meus argumentos de linha de comando

public static void main(String[] args)
{
    if(args[0] == null)
    {
        System.out.println("Proper Usage is: java program filename");
        System.exit(0);
    }
}

No entanto, isso retorna uma exceção de array fora dos limites, o que faz sentido. Estou apenas procurando o uso adequado.

Bobby S
fonte

Respostas:

159

Os argumentos nunca podem ser null. Eles simplesmente não existirão.

Em outras palavras, o que você precisa fazer é verificar a extensão de seus argumentos.

public static void main(String[] args)
{
    // Check how many arguments were passed in
    if(args.length == 0)
    {
        System.out.println("Proper Usage is: java program filename");
        System.exit(0);
    }
}
jjnguy
fonte
18

A resposta de @jjnguy está correta na maioria das circunstâncias. Você nunca verá uma nullString na matriz de argumento (ou uma nullmatriz) se mainfor chamada executando o aplicativo é executado a partir da linha de comando da maneira normal.

No entanto, se alguma outra parte do aplicativo chama um mainmétodo, é concebível que passe um nullargumento ounull array de argumentos.

No entanto (2), este é claramente um caso de uso altamente incomum, e é uma violação flagrante do contrato implícito para um mainmétodo de ponto de entrada. Portanto, não acho que você deva se preocupar em verificar os nullvalores dos argumentos em main. No caso improvável de que ocorram, é aceitável que o código de chamada obtenha um NullPointerException. Afinal, é um bug do chamador violar o contrato.

Stephen C
fonte
11

Para expandir este ponto:

É possível que a própria variável args seja nula, mas não por meio da execução normal. A execução normal será usada java.execomo ponto de entrada da linha de comando. No entanto, tenho visto alguns programas que usam C++código compilado com JNI para usar o jvm.dll, ignorando o java.exe inteiramente. Neste caso, é possível passarNULL para o método principal, caso em que args será nulo.

Recomendo verificar sempre if ((args == null) || (args.length == 0)), ou if ((args != null) && (args.length > 0))dependendo da sua necessidade.

Sean Crouse
fonte
0

Você deve verificar (args == null || args.length == 0). Embora a nullverificação não seja realmente necessária, é uma boa prática.

fastcodejava
fonte
1
Verificações desnecessárias NÃO são uma boa prática. A nullverificação é desnecessária, mas você está certo de que a lengthverificação é necessária,
Stephen C
-10

Se você não passar nenhum argumento, mesmo nesse caso, args será inicializado, mas sem nenhum item / elemento. Experimente o seguinte, você obterá o mesmo efeito :

 
public static void main(String[] args) throws InterruptedException {
        String [] dummy= new String [] {};
        if(dummy[0] == null)
        {
            System.out.println("Proper Usage is: java program filename");
            System.exit(0);
        }

    }

Puspendu Banerjee
fonte
1
Isso é totalmente incorreto. Se um aplicativo for iniciado sem argumentos de linha de comando, o mainmétodo será chamado com uma argsmatriz cujo comprimento é zero.
Stephen C,
@Stephen Um array sem nenhum elemento dentro, tem comprimento zero. Então o que há de errado com minha resposta?
Puspendu Banerjee
@Puspendu - o que há de errado é que dummy[0]lança uma exceção de índice de array fora dos limites !! Idem se você alterar o programa (voltar) para teste args[0]e executá-lo sem argumentos.
Stephen C
1
OK, eu entendo agora. Teria ajudado se você não tivesse digitado incorretamente sua primeira frase. Da forma como está escrito, é ininteligível. Noto que você silenciosamente o corrigiu em seu último comentário. Sorrateiro.
Stephen C
1
"Não dei nenhuma solução, mas tentei descrever o problema". Então não poste uma resposta. Poste um comentário.
Stealth Rabino de