É possível escrever um console de saída correta e portátil "Olá mundo" em java?

Guenther Brunthaler:

Eu sou novo para Java e não poderia encontrar ainda uma maneira de escrever um "Olá mundo" -Application que funciona corretamente sem qualquer alteração em todas as plataformas e também detecta e erros de saída alças.

Em particular, gostaria de portar o seguinte programa C portátil para JAVA:

"Makefile":

.POSIX:

TARGETS = hello

.PHONY: all clean

all: $(TARGETS)

clean:
    -rm $(TARGETS)

"Hello.c":

#include <stdio.h>
#include <stdlib.h>

int main(void) {
   if (puts("Hello, world!") >= 0 && fflush(0) == 0) return EXIT_SUCCESS;
   (void)fputs("An output error occurred.\n", stderr);
   return EXIT_FAILURE;
}

Este programa destina-se ao trabalho como este:

$ make
c99 -O    hello.c   -o hello

$ ./hello
Hello, world!

$ ./hello > /dev/full
An output error occurred.

Infelizmente, eu ainda não foi capaz de implementar o mesmo em JAVA.

Nem System.out.println (), nem System.out.flush () parecem buscar por I / O erros, ou talvez eu simplesmente não era capaz de pegá-los.

Já tentou capturar exceções do tipo IOException, mas o compilador me diz que

error: exception IOException is never thrown in body of corresponding try statement

de modo que este não é obviamente o caminho certo para fazê-lo.

Mas mesmo se eu poderia encontrar uma maneira de erros de saída de captura, eu ainda não tinha idéia do que o código de saída para usar portably, porque Java não parecem definir algo correspondente a EXIT_FAILURE de C.

Acho difícil de acreditar, considerando que JAVA é sempre elogiado como um sistema altamente portátil para desenvolvimento de aplicativos.

Seria muito chocante se a aplicação correcta e portátil do mesmo um simples "Olá mundo" já ultrapassou as capacidades deste "write once, run everywhere" plataforma.

Então, ajuda por favor me criar uma aplicação Java que se comporta exatamente como a versão C e ainda é portátil.

Graças à khelwood e outros, eu consegui criar a seguinte implementação Java que funciona melhor até agora:

public class HelloWorld {
   private static class OutputError extends java.io.IOException { }

   private static void println(String s) throws OutputError {
      System.out.println(s);
      if (System.out.checkError()) throw new OutputError();
   }

   private static void flush() throws OutputError {
      System.out.flush();
      if (System.out.checkError()) throw new OutputError();
   }

   private static int getExitFailureCode() {
      try {
         return (new java.lang.ProcessBuilder("/bin/false")).start().waitFor();
      } catch (Exception dummy) {
         return 99;
      }
   }

   public static void main(String[] args) {
      try {
         println("Hello, world!");
         flush();
      } catch (OutputError dummy) {
         System.err.println("An output error occurred.");
         System.exit(getExitFailureCode());
      }
   }
}

No entanto, esta não é verdadeiramente portátil, porque ele só vai funcionar de forma confiável em sistemas POSIX que fornecem um utilitário "false".

Caso contrário ele irá reverter para o código de retorno arbitrário de 99, que é obviamente perigoso porque alguns plataforma poderia, por exemplo, definir todos os valores negativos como códigos de falha e todos os outros valores como códigos de sucesso.

Kelv ॊ d:

System.outé um PrintStream.

Os docs para PrintStreamdizer:

Ao contrário de outros fluxos de saída, um PrintStreamnão gera uma IOException; em vez disso, situações excepcionais meramente definir um sinalizador interno que pode ser testado através do checkErrormétodo.

Você pode verificar System.out.checkError()para ver se ocorreu um erro.

Se você quer que seu programa para sair com um status diferente de zero, você pode usar System.exit.

por exemplo

if (System.out.checkError()) {
    System.err.println("An output error occurred.");
    System.exit(-1);
}

Veja também Existe um substituto para EXIT_SUCCESS e EXIT_FAILURE em Java?

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=201587&siteId=1
Recomendado
Clasificación