L'impression de message sur la Console sans utiliser de méthode main()
J'ai été demandé à cette question dans une interview.
Comment imprimer un message sur la console sans l'aide de main()
méthode?
- Comment voulez-vous commencer vous êtes à la demande sans méthode?
- Je ne vois pas cela comme une bonne question d'entrevue. Vous voulez sûrement pour tester le candidat est capable de résoudre des problèmes, et non pas la connaissance de peu utilisé aspects de Java?
- trivia est le pire genre de questions, quelqu'un qui posent ces questions ne méritent pas d'être mon patron.
- En Bash, il suffit de taper 'echo <message>'. Vous devriez obtenir des points supplémentaires pour faire la chose la plus simple possible.
- Pas possible dans/après Java7 comme méthode main() est recherché avant le chargement des classes.
Vous devez vous connecter pour publier un commentaire.
La
System.exit(0)
quitte le programme avant la jvm commence à regarder pourmain()
(Note: Cela ne fonctionne qu'avec la version 6 de java. Même si il compile avec JDK 7
javac
il ne peut pas être exécuté avec sesjava
, parce qu'il s'attend à unmain(String[])
méthode.)java Foo
il va charger la classe, imprimer le message; et nous quitter avant qu'il commence à trouver le point d'entrée pour l'exécution.Foo.java
. Appeléjavac Foo.java
et a essayé de le faire fonctionner avecjava Foo
/java -cp . Foo
. J'ai eu:Error: Main method not found in class Foo, please define the main method as: public static void main(String[] args)
. À l'aide du JDK 7 (à l'aide du JDK 6, il imprime une autre erreur similaire à cela). Où est le hic? Ah oui, et je n'ai pas exactement de soins à propos de cette Ideone chose jaillit.System.exit(0);
, depuis la JVM est en quelque sorte à la recherche pour lemain
méthode.javac
je peux le faire tourner avec le JRE/JDK 6java
mais JRE/JDK 7java
de ne pas l'exécuter. Pour le compiler avec le JDK 7javac
et vous ne pouvez pas l'exécuter avec rien. Veuillez mettre à jour votre réponse. Mes commentaires avant étaient trop éruption cutanée, cependant je savais que quelque chose était à l'arrêt.La statique bloc est exécuté dès que la classe est chargée avant de les
main();
méthode est invoquée et, par conséquent, avant demain()
est appelé,System.exit(0)
initie VM arrêter.La
System.exit
méthode s'arrête l'exécution du thread actuel et tous les autres morts dans leurs voies. LorsqueSystem.exit
est appelé, la machine virtuelle exécute deux tâches de nettoyage avant de s'éteindre.Tout d'abord, il exécute tous les crochets d'arrêt qui ont été enregistrés avec
Runtime.addShutdownHook
. Ceci est utile pour libérer des ressources à l'extérieur de la machine virtuelle. L'utilisation de l'arrêt des crochets pour le comportement que doit avoir lieu avant la VM sorties.La deuxième tâche de nettoyage effectué par la machine virtuelle lorsque
System.exit
est appeléles préoccupations des outils de finalisation. Si
System.runFinalizersOnExit
ou son jumeau maléfiqueRuntime.runFinalizersOnExit
a été appelée, la machine virtuelle s'exécute sur les finaliseurstous les objets qui n'ont pas encore été finalisé. Ces méthodes ont été désapprouvées une longue
il y a le temps et avec une bonne raison. Ne jamais appeler
System.runFinalizersOnExit
ouRuntime.runFinalizersOnExit
pour une raison: Ils sont parmi les plusdes méthodes dangereuses dans les bibliothèques Java. L'appel à ces méthodes peut entraîner dans les finaliseurs en cours d'exécution sur les objets vivants alors que les autres threads simultanément la manipulation
ce qui entraîne un comportement erratique ou de blocage.
En résumé,
System.exit
arrête tous les threads du programme immédiatement; il n'a pascause enfin blocs à exécuter, mais il n'exécuter l'arrêt des crochets avant d'arrêter
la VM. L'utilisation de l'arrêt des crochets pour mettre fin à des ressources externes lorsque la VM s'
vers le bas. Il est possible d'interrompre la VM sans l'exécution de l'arrêt des crochets en appelant
System.halt
, mais cette méthode est rarement utilisée.Dans un fichier appelé
A.java
Vous suffit de compiler le programme sur Windows. Ne pas les exécuter. 😛
CON
a une signification spéciale sur Windows, non?Vous pouvez définir une classe personnalisée chargeur qui imprime votre message :
Puis exécutez la commande java :
java -Djava.system.class.loader=MyClassLoader
(n'avez pas besoin d'ajouter une classe en paramètre)
Parce que l'initialiseur statique bloc est exécuté que lorsque la classe est chargée pour la première fois, nous pouvons imprimer “Hello World” sans écrire une méthode main. L'exécution est arrêtée à l'aide de “Système.exit () de la commande”. Donc, nous empêcher de “méthode main pas trouvé d'erreur”.
C'est une question délicate
Il a été possible jusqu'à la version 6 de java à utiliser le Système.out.println(); sans fonction main().
À partir de java 7 et suivantes, il n'est pas possible de le faire avec bloc statique. Il demandera principale méthode dans la classe principale.
Si vous ne voulez pas utiliser des bloc de trop, il peut être fait de la manière suivante
Cependant, veuillez noter que c'est pour la version 6 de Java version. Son ne travaillant pas dans Java 7 qui est dit pour être pris en charge dans Java 8. J'ai essayé avec JDK 1.8.0_77-b03, qui ne fonctionne toujours pas
Oui, vous pouvez imprimer un message à la console sans l'aide de main().
Créer un test avec JUnit et de l'exécuter:
Oui, la façon statique, mais dans la version précédente de JDK pas dans le JDK 1.7.
De sortie:Message: Votre message peut être imprimé sur la console sans méthode main () (si pas JDK7)
De sortie:Erreur: la méthode Principale ne retrouve pas dans la classe A3, veuillez définir la méthode main comme:
public static void main(String[] args)
Référence
En fait il ne fonctionne pas dans la dernière mise à jour de java 8. On peut appeler ça un bug fix selon eux, mais aussi loin que je crois à ma connaissance, cela ne peut pas être appelé comme une correction de bug, car elle aussi entraîner quelques changements conceptuels trop en programmation java.