PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Java] Console flushen funktioniert nicht - Console == null?


{655321}-Hades
2010-12-06, 15:09:20
Hallo,

ich habe da gerade ein Problem. Ich programmiere eine Simulation einer Zombieinfektion. Ziel war jetzt erstmal, eine Consolenausgabe zu programmieren, um die Simulationsmechanik zu implementieren und die Simulation später mit komplexerer Grafikausgabe zu versehen.

Der Code der Methode, welche die Consolenausgabe erzeugen soll, sieht nun folgendermaßen aus (wichtiger Teil in rot):

public static void drawSimulation() {

Environment.resetplan();

for (int i = 0; i < 20; i++) {
zombies[i].printLifeform();
}

for (int i = 0; i < 20; i++) {
humans[i].printLifeform();
}

Frame.title();
Environment.print();
Frame.statistics();

if (System.console() == null) {
System.out.println("WHERE'S MY FUCKING CONSOLE?");
} else {
System.console().flush();
}
}

...und erzeugt diese Ausgabe:

Z O M B I E L A N D VERSION 1.1


########H###########
##########Z#########
##########XZ########
ZH#######Z##########
####Z###H####Z######
##########Z#########
###########H########
H#X#####H#######Z###
########Z####H######
####H##Z############
####################
########Z###Z#######
#################Z##
#####Z##########H###
####################
#####HH#Z##Z########
###########X#Z######
#HZ###H#############
####H#######H#######
####################

Number of Zombies: 20 Number of Humans: 20
WHERE'S MY FUCKING CONSOLE?

Eigenartig, denn System.console() sollte als Objekt die Console zurückgeben. Tut sie aber offensichtlich doch nicht, oder zumindest in einer Art und Weise, dass sie null ist. Auf jeden Fall bekomme ich eine Null Pointer Exception, wenn ich flush() verwende und nicht die Abfrage vor den Aufruf klemme.

Ich habe wenig Lust, ewig lange Zeichenketten runterzuscrollen um zu überprüfen, das alles so läuft, wie es soll. Daher wüsste ich gerne, wie ich die Console flushen kann oder wie ich sie geeignet initialisieren kann, damit System.console() nicht mehr null zurück gibt.

Kann mir gerade jemand auf die Sprünge helfen?

RattuS
2010-12-06, 16:17:57
Wie wurde die Konsole denn erzeugt/wie startest du die Anwendung?

{655321}-Hades
2010-12-06, 16:55:49
Zuerst habe ich die Konsole überhaupt nicht initialisiert, dachte eigentlich auch nicht, dass das nötig ist, sondern dass sie ohnehin immer läuft. Offensichtlich ist dem nicht so: Wie initialisiere ich die Konsole denn?

Ich habe jetzt auch nochmal folgendes versucht:


import java.io.Console;

public class Simulation {

static Human[] humans;
static Zombie[] zombies;
static Console console = System.console();
public static void main(String[] args) {

Environment environment = new Environment();
Simulation.startSimulation();
Simulation.drawSimulation();
}

public static void startSimulation() {

zombies = new Zombie[20];

for (int i = 0; i < 20; i++) {
zombies[i] = new Zombie();
}

humans = new Human[20];

for (int i = 0; i < 20; i++) {
humans[i] = new Human();
}

}

public static void drawSimulation() {

Environment.resetplan();

for (int i = 0; i < 20; i++) {
zombies[i].printLifeform();
}

for (int i = 0; i < 20; i++) {
humans[i].printLifeform();
}

Frame.title();
Environment.print();
Frame.statistics();

if (console == null) {
System.out.println("WHERE'S MY FUCKING CONSOLE?");
} else {
console.flush();
}
}

}




...aber die Konsole ist immer noch null wenn ich sie anspreche.

Nagelbrett
2010-12-06, 18:20:41
Initialisieren musst du die nicht.

Aber wie startest du dein Programm denn?
Methods to access the character-based console device, if any, associated with the current Java virtual machine.

Whether a virtual machine has a console is dependent upon the underlying platform and also upon the manner in which the virtual machine is invoked. If the virtual machine is started from an interactive command line without redirecting the standard input and output streams then its console will exist and will typically be connected to the keyboard and display from which the virtual machine was launched. If the virtual machine is started automatically, for example by a background job scheduler, then it will typically not have a console.
Bei mir funktioniert es so, wie du es gemacht hast, wenn ich es normal starte.

{655321}-Hades
2010-12-06, 18:49:18
Hmm. Liegt es dann vielleicht daran, dass ich es direkt in Eclipse gestartet habe? Ich exportier's mal eben als executable, vielleicht läuft es dann...

RattuS
2010-12-06, 22:50:16
Hmm. Liegt es dann vielleicht daran, dass ich es direkt in Eclipse gestartet habe?
Bingo! Frage selbst beantwortet. Eclipse und NetBeans starten nicht aus der Konsole, sondern als Prozess. Das ist natürlich ziemlich unpraktisch, aber liegt einzig und allein an der IDE.

Gast
2010-12-08, 21:21:57
Entweder ich versteh das Kernproblem nicht, oder du suchst nach System.out.flush()?
Falls du da Puffern willst müsste das irgendwie über BufferedWriter(System.out) gehen...

Äh ich find System.console() auch nicht in der API - was genau verspul ich hier?

Gast
2010-12-08, 21:24:29
Gnäää blöde Oracle-Seite jetzt. Ok in Java 6 gibts System.console(). Ging vorher aber auch ohne. :)

Ectoplasma
2010-12-09, 08:49:25
... Eclipse und NetBeans starten nicht aus der Konsole, sondern als Prozess ...

Ein Prozess ist ein Prozess ist ein Prozess ...
Was hat das mit der Console zu tun? Genau nichts.

Es liegt wohl eher daran, dass es unter Windows standardmäßig keine Console beim starten eines Prozesses gibt. Diese muss man erst in "C" mit AllocConsole initialisieren. Siehe http://msdn.microsoft.com/en-us/library/ms681944%28VS.85%29.aspx. Wenn man ein Programm aus der Windows-Shell startet, dann wird das Consolen-Objekt an den gestarteten Prozess vererbt. In diesem Fall muss man die Console nicht explizit allozieren.

In Java kann man eine Console erzwingen, wenn man die VM mit java.exe startet. Vermutlich wurde aber mit javaw.exe gestartet. In diesem Fall wird keine Console alloziert. Soweit ich weiß, erzeugt Eclipse.exe ebenfalls keine Console.