Mittwoch, 4. Dezember 2013

 

Java Console mit eclipse

Java bietet seit Version 1.6 eine einfachere Methode (als java.io.BufferedReader) von der Konsole zu lesen: java.io.Console. Leider kann Console nicht innerhalb von eclipse verwendet werden, da sich diese Entwicklungsumgebung direkt mit der Ein- und Ausgabe verbindet.

Es gibt eine - etwas umständliche - Lösung dieses Problems, die hier auf stackoverflow.com beschrieben wird.

Hier eine für eclipse unter Linux adaptierte Variante. Nehmen wir an, die folgende Klasse, soll mit dem Debugger getestet werden:

import java.io.Console;
public class TestDebugging {
    public static void main(String[] args) {
        Console console = System.console();
        if (console != null) {
            String line = console.readLine(">>> ");
            System.out.println(line);
        } else {
            System.err.println("sorry, no console available!");
        }
    }
}
Startet man diese Klasse in eclipse (egal ob "Run" oder "Debug"), dann wird immer "sorry, no console available!" angezeigt. Startet man die Klasse in einem Terminal, so funktioniert sie problemlos:
hp@if211l $ java TestDebugging
>>> test
test
hp@if211l $ 

Das Prinzip

Man muss das Java-Programm in einem Terminal starten und sich mit eclipse "remote" verbinden. Dazu verwendet man für den Start der Klasse folgenden Aufruf:

hp@if211l $ java -Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=y TestDebugging
Listening for transport dt_socket at address: 8787
Java wartet (suspend=y) nun darauf, dass man sich mit dem Debugger über Port 8787 (address=8787) hin verbindet. Im eclipse ruft man dann bei geöffnetem Sourcecode der Klasse "Run>Debug Configurations" auf und legt eine neue "Remote Java Application" an.

Nachdem man (sinnvollerweise) einen Breakpoint gesetzt hat, kann man diese Debug-Konfiguration aufrufen und die Klasse debuggen. Die Ein- und Ausgabe erfolgt dann im Terminal:

Umsetzung

Um die Sache etwas komfortabler zu machen, sollte man folgendes Shell-Script erstellen:

#!/bin/bash
# launch java for external debugging
export D_PORT=8787
export D_DBG="-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,\
address=${D_PORT},server=y,suspend=y"
x-terminal-emulator -x java ${D_DBG} -cp ./bin/ $1 &

Dieses Script kann nun unter "Run>External Tools Configuration" eingerichtet werden:

Das Script startet ein Terminal-Fenster (x-terminal-emulator -x) mit dem entsprechenden Java-Aufruf (java -Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=y).

Debugging funktioniert wie oben beschrieben, indem man "Remote Java Application" verwendet.

Labels: , , , ,


Montag, 2. Dezember 2013

 

Aufgaben zu Java (POS1: 2BHIF)


  1. Schreiben Sie ein einfaches Java Programm, welches "Hello World" ausgibt. Nennen Sie das Programm Hello.java. Verwenden Sie dazu einen Texteditor und übersetzen Sie das Programm auf der Kommandozeile.
  2. Schreiben Sie ein einfaches Java-Programm, welches das kleine Einmaleins ausgibt. Welchen Namen könnte das Programm haben?
     X  1  2  3  4  5  6  7  8  9 10
     1  1  2  3  4  5  6  7  8  9 10 
     2  2  4  6  8 10 12 14 16 18 20 
     3  3  6  9 12 15 18 21 24 27 30 
     4  4  8 12 16 20 24 28 32 36 40 
     5  5 10 15 20 25 30 35 40 45 50 
     6  6 12 18 24 30 36 42 48 54 60 
     7  7 14 21 28 35 42 49 56 63 70 
     8  8 16 24 32 40 48 56 64 72 80 
     9  9 18 27 36 45 54 63 72 81 90 
    10 10 20 30 40 50 60 70 80 90 100
    

    Verwenden Sie wieder einen Texteditor und den Java-Compiler auf der Kommandozeile.
  3. Erstellen Sie mit eclipse ein Java-Projekt java-intro. Erzeugen Sie ein package intro1 ("intro eins").
    Erstellen Sie in diesem Paket die beiden Klassen von oben (in das Projekt-Verzeichnis kopieren und an das package anpassen). Starten Sie die beiden Klassen von eclipse aus.
  4. Starten Sie die beiden Klassen von der Kommandozeile aus. Wo sind die Class files zu finden, wie sieht der Aufruf aus?
  5. Erstellen Sie im package intro1 eine Klasse Schleife, die (im main) eine Zahl einliest und dann alle Zahlen von 1 bis zu der gegebenen Zahl ausgibt. Beispielaufruf:
    Grenze ? 10
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
  6. Erweitern Sie die Klasse Schleife so, dass zwei Zahlen eingegeben werden. Es sollen dann die Zahlen von der ersten bis zur zweiten ausgegeben werden. Wenn die zweite Zahl kleiner ist, dann soll eine absteigende Folge ausgegeben werden. Beispielaufruf:
    von? 15
    bis? 10
    15
    14
    13
    12
    11
    10
    
  7. Erzeugen Sie ein mercurial-Repository für das Projekt.

Labels: , ,


This page is powered by Blogger. Isn't yours?

Abonnieren Posts [Atom]