47 votes

Impression d'un message sur la console sans utiliser la méthode main()

Cette question m'a été posée lors d'un entretien.

Comment imprimer un message sur la console sans utiliser main() méthode ?

3 votes

Comment démarrer une application sans méthode principale ?

17 votes

Je ne pense pas que ce soit une bonne question d'entretien. Vous voulez certainement tester la capacité du candidat à résoudre des problèmes, et non sa connaissance d'aspects peu utilisés de Java ?

16 votes

@CallumRogers +1 trivia sont les pires questions, ceux qui posent ces questions ne méritent pas d'être mon patron.

65voto

Bala R Points 57552
public class Foo {
    static {
         System.out.println("Message");
         System.exit(0);
    } 
}

En System.exit(0) quitte le programme avant que la jvm ne commence à rechercher des main()

(Remarque : cela ne fonctionne qu'avec Java 6. Même s'il se compile avec la version 7 du JDK <code>javac</code> il ne peut pas être exécuté avec son <code>java</code> parce qu'il s'attend à ce qu'un <code>main(String[])</code> méthode.)

1 votes

@Roflcoptr $ java Foo comme n'importe quel autre

1 votes

@Roflcoptr java -cp . Foo comme un programme avec main ;)

0 votes

@Roflcoptr il suffit de compiler la classe et de l'exécuter java Foo il chargera la classe, imprimera le message et nous quitterons avant qu'il ne commence à trouver le point d'entrée pour l'exécution.

12voto

Lion Points 7328
public final class Main {
    static {
        System.out.println("Hello World");
        System.exit(0);
    }
}

Le bloc statique est d'abord exécuté dès que la classe est chargée, avant que le bloc statique ne soit exécuté. main(); est invoquée et donc avant que la méthode main() est appelé, System.exit(0) déclenche l'arrêt de la VM.

En System.exit interrompt l'exécution du thread en cours et de tous les autres. Quand System.exit est appelé, la machine virtuelle effectue deux tâches de nettoyage avant de s'arrêter.

Tout d'abord, il exécute tous les crochets d'arrêt qui ont été enregistrés auprès de Runtime.addShutdownHook . Cette fonction est utile pour libérer des ressources externes à la VM. Utilisez les crochets d'arrêt pour les actions qui doivent se produire avant la sortie de la VM.

La deuxième tâche de nettoyage effectuée par la VM lorsque System.exit est appelé concerne les finaliseurs. Si l'un ou l'autre System.runFinalizersOnExit ou son jumeau maléfique Runtime.runFinalizersOnExit a été appelé, la VM exécute les finaliseurs sur tous les objets qui n'ont pas encore été finalisés. Ces méthodes ont été dépréciées il y a longtemps longtemps et à juste titre. N'appelez jamais System.runFinalizersOnExit ou Runtime.runFinalizersOnExit pour quelque raison que ce soit : Ils font partie des méthodes les plus les plus dangereuses des bibliothèques Java. L'appel à ces méthodes peut entraîner l'exécution de finaliseurs sur des objets vivants alors que d'autres threads les manipulent simultanément, ce qui entraîne un comportement erratique ou une perte d'efficacité. les manipulent simultanément, ce qui peut entraîner un comportement erratique ou un blocage.

En résumé, System.exit arrête immédiatement tous les threads du programme. n'entraîne pas l'exécution de blocs finaux, mais exécute des crochets d'arrêt avant d'arrêter la VM. la VM. Utilisez les crochets d'arrêt pour mettre fin aux ressources externes lorsque la VM s'arrête. s'arrête. Il est possible d'arrêter la VM sans exécuter les crochets d'arrêt en appelant System.halt mais cette méthode est rarement utilisée.

11voto

Peter Lawrey Points 229686

Dans un fichier appelé A.java

class Con {
    String hi = "\n\nHello World\n\n";
}

Il suffit de compiler le programme sous Windows. Pas l'exécuter :-P

2 votes

Cela fonctionne parce que CON a une signification particulière sous Windows, n'est-ce pas ?

3 votes

Il permet également d'imprimer un grand nombre d'autres choses. Au fait, qu'est-ce que "Con" ? Il ne permet pas de nommer le fichier "Con.java". +1.

10 votes

-1 Fournir une solution spécifique à une plate-forme à un problème dans un langage indépendant de la plate-forme est incorrect.

8voto

Super Chafouin Points 1464

Vous pouvez définir un chargeur de classe personnalisé qui imprime votre message :

public class MyClassLoader extends ClassLoader {
    public MyClassLoader(ClassLoader other) {
         super(other);
         System.out.println("Hi there");
         System.exit(0);
    }
}

Exécutez ensuite la commande java c

java -Djava.system.class.loader=MyClassLoader

(il n'est pas nécessaire d'ajouter une classe en tant que paramètre)

6voto

Massimiliano Peluso Points 13357
class MainMethodNot
{
    static
    {
        System.out.println("Hello World");
        System.exit(0);

    }
}

Comme le bloc d'initialisation statique est exécuté lorsque la classe est chargée pour la première fois, nous pouvons imprimer "Hello World" sans écrire de méthode principale. L'exécution est arrêtée à l'aide de la commande "System.exit()". Nous évitons ainsi l'erreur "méthode principale introuvable". C'est une question assez délicate

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X