... jak na něj


Protože Java patří mezi nejpoužívanější programovací jazyky, existuje pro ni velké množství editorů a programovacích prostředí. Pokud máme nainstalované JDK, můžeme pro psaní programů v Javě použít libovolný textový editor, který neukládá do výsledného souboru navíc žádné informace pro formátování (např. MS Word je pro tento účel naprosto nepoužitelný, protože do výsledného souboru ukládá spoustu nadbytečných informací, se kterými by si překladač při spouštění programu neporadil).

Obyčejný textový editor však nezvýrazňuje syntaxi zdrojového kódu (nijak nám psaní programu nezpřehledňuje). Existují proto "chytřejší" editory, které během psaní zdrojového kódu barevně odlišují klíčová slova, textové řetězce, číslice apod., takže je pro nás editovaný zdrojový text výrazně čitelnější (např SciTe).

Půjdeme-li ještě dál a budeme od editoru požadovat další funkce, které nám programování usnadní (doplňování zdrojového kódu, debugger, snažší správu souborů apod.), najdeme celou řadu freewarových i placených produktů. Mezi nejpopulárnější a neustále se rozvíjející patří prostředí Eclipse SDK. Tento nástroj, který mimo jiné nabízí příjemné pracovní prostředí, debugger a nemalé množství rozšiřujících plugginů, je možné bezplatně stáhnout z domovské stránky http://www.eclipse.org. V současné době je k dispozici jeho nejnovější verze Eclipse SDK 4.5.0 M1, která má kódové jméno Mars. Samozřejmě i používání prostředí Eclipse musí předcházet instalace Javy (nejlépe JDK 8).

Tento návod nám ukáže, jak si Eclipse stáhnout, nainstalovat a jak ho jednoduše používat. Potřebné činnosti můžeme rozdělit do následujících několika kroků:

1. Stažení a instalace Eclipse SDK
2. První spuštění
3. Vytvoření projektu a souborů
4. Spuštění programu
5. Jak spustit samostatný zdrojový kód
6. Práce s balíky
7. Kreslení - používaní nástroje DrawingTool
8. Debugger



Stažení a instalace Eclipse SDK

Abychom mohli Eclipse používat, musíme mít k dispozici soubor eclipse-SDK-4.2-win32.zip (případně alternativní verzi pro jinou verzi operačního systému). Ten si můžeme stáhnou ze stránek Eclipse (po pravé straně je pouze třeba si zvolit správnou verzi v závislosti na našem operačním systému).

Předpokládejme, že jsme si instalační soubor opatřili. Co nás čeká teď? Soubor eclipse-standard-mars-M1-win32-x86_64.zip je nutné rozbalit někam, odkud bude možné později program spouštět (Eclipse se neinstaluje, ale pouze rozbalí). Doporučené místo je c:\Program Files\eclipse. Adresář obsahuje několik složek a samostatných souborů. Mimo jiné je v něm umístěn také soubor eclipse.exe. Tento soubor slouží ke spuštění programu.



Tip týdne: Je dobré umístit si zástupce souboru eclipse.exe tak, aby byl po ruce (např. na pracovní plochu nebo do hlavního panelu).



První spuštění

Po spuštění programu (spuštění souboru eclipse.exe) musíme ještě nastavit cestu k tzv. workspace (složce, kterou bude Eclipse používat jako pracovní). Tuto složku můžeme ponechat tak, jak se nastaví automaticky nebo si zvolit libovolnou jinou složku. Pokud nechceme, aby se tento dialog otevíral při každém spuštění, zaškrtneme volbu "Use this as the default and do not ask again". Je dobré si cestu k workspace pamatovat, abychom veděli, kde máme své soubory později hledat, pokud je potřebujeme například nakopírovat na flash disk a přenést je na jiný počítač (třeba školní :). V případě absence instalace JDK, nebo jeho špatného nastavení nahlásí Eclipse chybu a nespustí se.



Poté se již spustí prostředí Eclipse s hlavní uvítací stránkou.



Po jejím uzavření se nám pracovní prostředí otevře ve své plné kráse :-). Co znamenají a k čemu slouží jeho jednotlivé části se dozvíme v dalších kapitolách.





Vytvoření projektu a souborů

Zatím máme pracovní prostředí prázdné, pojďme se tedy podívat na to, jak vytvořit projekt, ve kterém budeme moci vytvářet soubory se zdrojovými kódy. Bez projektů se v Eclipsu neobejdeme, každý program musí být totiž uložen v některém z projektů, aby ho bylo možné spustit. Volbou File -> New -> Project a pak Java Project v menu získáme následující dialogové okno.



Zde můžeme nastavit několik vlastností zakládaného projektu. Pro začátek nám však bude stačit zadání jména projektu (Project name) a následný stisk tlačítka Finish. Dialogové okno se zavře a v levém sloupci pracovního prostředí (tvz. Package Explorer) nám přibyde první položka - námi založený projekt.


Vytvoření nového souboru v projektu

Vytvořili jsme projekt. Ten je však zatím prázdný, neobsahuje žádný soubor se zdrojovým kódem. Aby tedy celá naše snaha měla nějaký efekt (= abychom mohli spustit program napsaný v Javě), musíme teď nějaký program vytvořit. Vytvoříme tedy novou třídu - volbou File -> New -> Class, popř. tlačítkem v hlavní nástrojové liště. V zobrazeném dialogu můžeme zadávat parametry nově vytvořené třídě. Zadáme jméno třídy (Name), popř. také jméno balíku Package. Pokud necháme jméno balíku nevyplněné, je třída vložena do defaultního balíku. Na závěr stiskneme tlačítko Finish. Pokud bychom chtěli třídu později vložit do jiného balíku, můžeme ji pomocí myši jednoduše přetáhnout v Package Exploreru.



V Package Exploreru na levé straně obrazovky se nám teď v projektu objevil nově vytvořený soubor. Ten se zároveň otevřel v hlavní části okna a my ho můžeme libovolně editovat, ukládat a vytvořit tak takový zdrojový kód, jaký potřebujeme pro správnou funkčnost našeho programu ;)




Přidání existujícího souboru do projektu

Samozřejmě, že vytvoření nového souboru není jediná možnost, jak do projektu přidat soubor. Máme-li již zdrojový kód hotový (řekněme v souboru Soubor.java), stačí tento soubor nakopírovat do adresáře zdrojových kódů příslušného projektu v pracovní složce (v našem případě C:\Documents and Settings\Administrator\workspace\ppa1_first\src\). Aby se změna projevila v Package Exploreru, klikneme na projekt, do kterého jsme soubory přidávali, a stiskneme klávesu F5 (refresh). Pozor, pokud používáme balíky, musí být i při kopírování zachována správná adresářová struktura, která balíku odpovídá.

Pokud se nám nechce kopírovat soubory mezi adresáři, můžeme využít ještě jiný způsob přidání existujících souborů do projektu. Jednoduše si soubory v jakémkoli správci souborů (Total Commander, Průzkumník, ...) nakopírujeme do schránky (CTRL+C, CTRL+Insert, nebo kliknutím pravým tlačítkem na označené soubory a volbou Kopírovat v menu).



Poté se přepneme zpět do prostředí Eclipse, pravým tlačítkem myši klikneme na balík, do kterého chceme soubor přidat, a v menu zvolíme Paste, popřípadě označíme název balíku a stiskneme kombinaci kláves CTRL+V, popř. Shift+Insert. Soubory se tak vloží do projektu a jsou automaticky nakopírovány do adresářové struktury workspace.



Poslední, pro některé možná nejjednodušší, možností je přetažení označených souborů ze správce souborů myší přímo do projektu. I tomto případě se soubory nakopírují automaticky tam, kam patří. Eclipse se nás ještě raději zeptá, zda má soubory zkopírovat do adresářové struktury workspace, nebo jen nastavit link na stávající soubor, doporučuji všat použít kopírování.



Stalo se Vám, že jste na svém počítači vytvořili program, přenesli ho na jiný a najednou Vám některé standardní metody (např. System.out.format() apod.) nefungují? Zkontrolujte si, zda máte v projektu nastavenou správnou verzi Javy. V menu zvolte Project -> Properties a v otevřeném dialogovém okně zvolte položku Java Compiler. Po zaškrtnutí checkboxu Enable project specific settings si můžete potřebnou verzi Javy zvolit. Vše potvrdíte stiskem tlačítka OK



Práce s prostředím Eclipse

Tím, že jsme začali vytvářet zdrojový kód, začínají se nám objevovat položky i v ostatních částech pracovní plochy. Je tedy na čase si vysvětlit jejich základní význam:

Levý sloupec

Package Explorer - slouží pro správu projektů, jejich souborů, knihoven apod. Projekty uložené v pracovním prostředí lze otevírat a zavírat, u otevřeného projektu můžeme procházet jednotlivé soubory, seznamy lze rozbalovat a následně zase sbalovat. Kliknutím na soubor se daný soubor otevře v pracovní části okna.

Pravý sloupec

Outline - zobrazuje všechny proměnné, metody a třídy v právě otevřeném souboru. Kliknutím na příslušnou položku se kurzor v souboru přenese na její deklaraci.

Spodní řádka




Obsahuje několik záložek, ze kterých nás budou zatím zajímat pouze dvě:

Problems - odkazuje na chyby (Errors) a upozornění (Warnings), poklikáním na hlášení chyby/warningu je daný problém vyznačen přímo ve zdrojovém kódu
Console - zajišťuje textový výstup



Pro zjednodušení a hlavně programování nabízí Eclipse řadu funkcí pro práci se zdrojovým kódem:

automatické doplňování   CTRL + mezerník
automatická korekce importů   CTRL + Shift + O
podtrhávání chyb   automaticky (aktualizace po uložení souboru - CTRL + S)
hromadné přejmenování názvů   ALT + Shift + R
rekompilace + spuštění   F11

... a řadu dalších, na které v průběhu programování každý přijde a začne je ochotně využívat.



Spuštění programu

Nyní jsme tedy vytvořili zdrojový kód našeho programu, jak ho ale spustit? Postup je následující: V menu zvolíme Run -> Run As -> Java Application. Stejného efektu docílíme kliknutím na ikonku a volbami Run As -> Java Application. V obou případech musíme mít v hlavním okně otevřený soubor obsahující metodu main(), ve kterém je aktivní kurzor. Další možností, jak spustit program, je kliknout na název souboru obsahující metodu main() v Package Exploreru pravým tlačítkem a zvolit opět Run As -> Java Application. Textové výstupy programu jsou vypsány na konzoli. Pokud budeme program spouštět opakovaně, můžeme použít tlačítko v hlavní nástrojové liště nebo klávesu F11.





Vlastnosti kompilace lze měnit i dodatečně volbou (Run -> Run Configurations...). Jednou z užitečných vlastností, které lze nastavit, je nastavení parametrů pro spouštění programu (viz spouštění z příkazové řádky ve tvaru: java Hello aaa) a sice zadáním parametrů do textového pole Program arguments v záložce Arguments.



Pokud chcete nastavit vlastnosti kompilace a ještě jste program nespustili, musíte nejdříve novou kompilaci vytvořit. Není to nijak komplikované, stačí v otevřeném dialogovém okně zvolit Java Aplication a následně kliknout na tlačítko .



Jak spustit samostatný zdrojový kód

Problém je jednoduchý: studenti a studentky PPA1 si doma připraví programy a chtějí je na cvičení upravit nebo se ujistit, že jsou naprogramované správně. Programy (v podobě zdrojových kódů) si přinesou na cvičení a chtějí je co nejjednodušším způsobem načíst do Eclipsu. Jak to udělat?

V laboratoři už je Eclipse nainstalovaný a jistě už v něm doma pracovali, kapitoly 1 a 2 mohou tedy klidně přeskočit. Podle kapitoly 3 Vytvoření projektu a souborů si vytvoří projekt s libovolným názvem (jako vhodný si troufám navrhnout například naše osobní číslo A09xxx). Pokud používají správu souborů uvedenou v kapitole 6 Práce s balíky, volí názvy adekvátním způsobem. Po vytvoření prázdného projektu se ve složce označené jako pracovní (tzv. workspace) vytvoří adresář s názvem shodným se jménem projektu. Do tohoto adresáře studenti a studentky překopírují své vlastnoručně vyrobené zdrojové kódy (buď do defaultního nebo vhodně pojmenovaného balíku). Poté se vrátí do pracovního prostředí Eclipsu, v okně Package Explorer kliknou na projekt ppa1 a stisknou klávesu F5 (provedou refresh). Další možností je nakopírování souborů nebo jejich přetažení myší z Total Commanderu nebo Průzkumníka přímo do projektu (pozor na dodržení správné adresářové struktury). Podrobnější popis všech tří variant najdeme v podkapitole Přidání existujícího souboru do projektu. Všechny nakopírované zdrojové kódy teď můžeme dvojklikem otevřít, upravit a dále s nimi pracovat.



Práce s balíky

V předchozím textu se již několikrát objevil pojem balík (package). Balíky v podstatě k funkčnosti našich programů nezbytně nutně nepotřebujeme. Pokud programujeme jednoduché příklady, jejichž zdrojový kód je uložený v jednom nebo pouze několika zdrojových souborech, bez problémů se bez balíků obejdeme. Jestliže však začneme pracovat na větším programu nebo si ve svých zdrojových kódech chceme udržovat přehlednost a pořádek, balíky se nám budou hodit. Přestože na cvičeních PPA1 ve většině případů nepotřebujeme velké množství tříd, je vhodné balíky používat právě pro organizování zdrojových souborů. Jedna z možných variant je následující: Na začátku semestru si každý student vytvoří projekt se jménem shodujícím se se svým osobním číslem (takže například A07999). Pro každé cvičení se pak vytvoří samostatný balík (např. cv01), do kterého si student bude ukládat zdrojové kódy vypracovaných příkladů příslušného cvičení.

Vytvoření nového balíku je jednoduché. Buď v menu zvolíme File -> New -> Package, nebo použijeme ikonu v hlavní nástrojové liště. Dialog pro vytvoření nového balíku má pouze dvě kolonky. Source folder udává, do kterého z projektů bude balík vytvořen. Druhá řádka Name pak slouží pro zadání jména balíku. Po stisku tlačítka Finish se vytvoří nový balík.



Na následujícím screenshotu vidíme strukturu, která vznikne, pokud budeme používat výše popsaný způsob organizace našich zdrojových kódů:



Pozor:
Odevzdávání takto organizovaných zdojových kódů vyžaduje před odevzdáváním přes validátor ještě jednu drobnou úpravu a sice smazání nebo zakomentování jedné řádky ze zdrojového kódu. Jestliže pracujeme s balíky, obsahuje každá třída informaci, do kterého balíku patří - např. package cv01;. Validátor však předpokládá, že odevzdávané zdrojové kódy nejsou zařazené do žádných balíků, proto je nutné tuto řádku ze zdrojového kódu odstranit (zakomentovat nebo smazat).



Kreslení - používání nástroje DrawingTool

Abychom mohli ve svých programech snadno používat grafiku, budeme používat již připravenou knihovnu DrawingTool. Návod na používání knihovny jako takové najdeme v samostatném pdf na stránkách nebo CD předmětu. Jak ale zařídit, aby DrawingTool fungoval i v Eclipsu? Není to tak složité, jak by se mohlo zdát. Jediné, co k tomu potřebujeme, je soubor DrawingToolEclipse.jar a chvilka nastavování.

JAR soubor můžeme mít v podstatě kdekoli, vhodným místem, kam ho uložit je přímo do workspace Eclipsu (např. C:\Documents and Settings\Administrator\workspace\). Teď ještě musíme projektu nastavit, že má Eclipse tento soubor používat jako knihovnu. To uděláme v menu Project -> Properties, nebo kliknutím pravým tlačítkem na projekt v Package Exploreru a volbou Properties. V Dialogovém okně dále volíme položku Java Build Path a poté záložku Libraries. Po pravé straně najdeme tlačítko Add External JARs....



To nám umožní zvolit cestu k souboru DrawingToolEclipse.jar a přidat ho mezi knihovny. Tlačítkem OK pak vše potvrdíme.



Od této chvíle zná Eclipse cestu ke knihovně a my ji můžeme používat. Aby však překladač věděl, že ji má používat, je nutné ve zdrojovém kódu, který grafické funkce používá, importovat balík ppa1 - import ppa1.DrawingTool; (viz zvýrazněná řádka v kódu na obrázku). Teď už můžeme začít ve svých programech bez obav používat grafiku.



Při odevzdávání příkladů přes validátor musíme udělat opět drobnou úpravu jako při používání balíků a sice smazat nebo zakomentovat import balíku, popř. i definici balíku, pokud v kódu je.





Debugger

Až dosud jsme pracovali v tzv. Java perspektivě (to poznáme podle stisknutého tlačítka Java v pravém horním rohu obrazovky). Tato perspektiva je vhodná pro programování, správu zdrojových souborů apod. Pro ladění je praktičtější používat tzv. Debug perspektivu. Do té se musíme nejdříve přepnout. V pravém horním rohu najdeme tlačítko Open Perspective , po jeho stisku nám Eclipse nabídne menu, ve kterém si můžeme Debug perspektivu otevřít. Poté se v pravé horní části objeví nové tlačítko Debug, pomocí kterého můžeme pracovní prostředí Eclipsu přepnout do perspektivy vhodné pro ladění.


Celé pracovní prostředí se tak přepne do následující podoby:




Pro další výklad bude lepší zvolit trošku složitější vzorový příklad. Jedná se o příklad na výpočet mocniny e^x.

import java.util.*;

public class LadeniPomociDebuggeru {
  final static double EPS = 1e-3;
  static int atribut = 2;

  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);

    System.out.println("Iteracni vypocet e**x");
    System.out.print("Zadej x: ");
    int x = sc.nextInt();
    System.out.println("x=" + x);  // ladici vypis

    double suma = 1.0;  // vypocet
    double clen = 1.0;
    int i = 1;

    while (clen > EPS) {
      clen *= (double) x / i;
      suma += clen;
      System.out.format("i=%2d, clen=%.3f, suma=%.3f%n", i, clen, suma);  // ladici vypis
      i++;
      atribut = i;
    }

    System.out.println("Vysledek: " + suma);
    // ladici vypisy
    System.out.println("Funkci:   " + Math.exp(x));
    System.out.println("Presnost: " + Math.abs(Math.exp(x) - suma));
  }
}
      

Jak debugger spustit:

Pokud spouštíme debuger poprvé, musíme nejdříve vytvořit kompilaci pro debuggování. Tu vytvoříme podobně jako kompilaci pro spouštění programu buď kliknutím na ikonu a následnou volbu Debug As -> Java Aplication nebo v menu zvolíme Run -> Debug As -> Java Aplication.



Pokud chceme nastavovat podrobnější parametry pro debuggování zvolíme Run -> Run Configurations... a pokračujeme jako při vytváření kompilace pro spuštění bez debuggování:





Pokud budeme ladění spouštět opakovaně, stačí nám, když použijeme tlačítko v hlavní nástrojové liště.

K čemu všemu můžeme debugger použít:

Po stisku tlačítka Debug se spustí program v ladicím režimu. Po zahájení debug režimu máme k dispozici další nástrojovou lištu pracovního okna Debug (význam jednotlivých tlačítek se dozvíme za chvíli).



Během ladění standardně potřebujeme alespoň několik základních činností:
  • nastavení míst přerušení programu (breakpoints) - jsou to speciálně označené řádky zdrojového kódu, pokud program začne zpracovávat tuto řádku, zastaví se. Breakpoint přidáme/odstraníme dvojklikem na levou krajní část editoru kódu. Breakpoit je umístěn, objeví-li se před řádkem modrý puntík.



  • výpisy všech dostupných proměnných - lokální proměnné se vypisují automaticky všechny, nelokální proměnné může jich být mnoho) jsou vypisovány na žádost. Výpis lokálních proměnných je prováděn v okně Variables v pravé horní části obrazovky. Lokální proměnná je zde zobrazena, jakmile je jí v běhu programu přiřazena hodnota.



    Jestliže chceme během ladění kontrolovat obsah statických globálních proměnných a konstant, musíme si zobrazení nastavit. To provedeme v menu okna Variables -> Java zaškrtnutím položek Show Constants a Show Static Variables



    Hodnotu proměnné získáme také tím, že na ní najedeme kurzorem myši. Pokud už jí byla přiřazena hodnota, zobrazí se, pokud ne, zobrazí se pouze popis proměnné.



  • krokování programu řádku po řádce - krokování dovnitř podprogramů (Step into) nebo provedení podprogramu jako jeden příkaz (Step over) - tlačítka v nástrojové liště Debug
  • běh programu do následujícího breakpointu - tlačítko Resume v nástrojové liště Debug
  • ukončení běhu programu - tlačítko Terminate v nástrojové liště Debug
Použití debuggeru významně urychluje ladění programu a je vhodné se naučit alespoň jeho základní možnosti. Eclipse má debugger na vysoké úrovni.



Výjimka ClassNotFoundException(Object).<init>() a její možné příčiny:

Tak si to představte. Napíšete program a chcete ho oddebuggovat a debugger Vám začne vyhazovat výjimku ClassNotFoundException. Co s tím? Jedním z možných problémů je nevyhovující nastavení Java compileru. Nastavení zkontrolujeme jednoduše. Například v menu zvolíme Project -> Properties -> Java Compiler v sekci Classfile Generation by měly být zaškrtány alespoň první 4 položky. Jedná se o nastavení informací přidávaných do *.class souborů, které potom debugger využívá. Pokud bychom jejich generování zakázali, debugger je bude postrádat. Pokud je toto nastavení správně, problém může být ještě jinde.

Ukažme si problém na reálné situaci.

public class App {
  public static void main(String[] args) {
    for (int i=0; i<5; i++) {
      Vrchol novy = new Vrchol(i);
    }
  }
}

public class Vrchol {
  int klic;
  public Vrchol(int klic) {
    this.klic = klic;
  }
}
Umístíme breakpoint na řádek Vrchol novy = new Vrchol(i); do třídy App. Po zastavení běhu programu na breakpointu začneme pomocí Step Into náš program krokovat. Pokud vše bez problémů funguje, buďte rádi a nelamte si následujícím vysvětlovánim hlavu :), pokud ale během debuggování narazíte na problém, třeba vám následující popis pomůže najít řešení.

Pokud se v příkladu snažíte najít nějakou chybu, hledáte marně, příklad je opravdu správně, a přesto Eclipse hlásí chybu. Jak je to možné? Eclipse má pro debuggování javovských zdrojáků defaultně nastaveno při použití Step Into procházení i standardních balíků (případně i dalších importovaných balíků). Co se tedy stane ve chvíli, kdy se dostaneme na řádek Vrchol novy = new Vrchol(i); a stiskneme Step Into? Debugger se bude snažit zanořit do standardně volané metody super() v konstruktoru třídy Vrchol a přesně to vyvolá naši výjimku, protože debugger samozřejmě nemá k dispozici zdrojáky. Stejný problém vyvolá i situace, kdy umístíme breakpoint na řádku s nějakou standardní funkcí - např. System.out.println();

V našem případě by stačilo umístit breakpoint až do konstruktoru třídy Vrchol, obecně na to ale budeme muset jinak. Abychom se vyhnuli zanořování do standardních knihoven Javy, trošku si změníme nastavení debuggeru. V menu zvolíme Window -> Preferences -> Java -> Debug -> Step Filtering. Tady si zaškrtáme balíky, které nemají být při krokování brány v potaz. V našem příkladě bude stačit zaškrtnout balík java.*. Teď je ještě potřeba zapnout používání filtru, to zařídíme stiskem tlačítka Use Step Filters/Step Debug v liště debug okna. Od této chvíle by mělo debuggování fungovat :)