Post

Visualizzazione dei post da giugno, 2012

Tipi primitivi: range di rappresentazione

DOMANDA: Quali sono i range di valori rappresentabili dai tipi di dati primitivi Java? RISPOSTA: Benché non siano facilissimi da ricordare, è importante sapere i limiti di rappresentazione dei diversi tipi per prevenire o evitare di trovarsi a fronteggiare errori di calcolo difficilmente individuabili. Ecco una tabella riepilogativa dei diversi range : BYTE (8 bit) :             da     -128     a     127   SHORT (16 bit) :           da     -32.768     a     32.767 INT (32 bit) :             da     -2.147.483.648     a     2.147.483.647 LONG (64 bit) :            da     -9.223.372.036.854.774.808     a     9.223.372.036.854.774.807 FLOAT (32 bit) :           da    1,4e -045      a     3,4e +038 DOUBLE (64 bit) :          da    4,9e -324      a     1,8e +308 CHAR (16 bit) - Unicode:  da     0    a     65.536 BOOLEAN (1  bit) :             true     o     false Ed ecco cosa succede a sbagliare il tipo di dato in un calcolo: public class RangeTest {   publ

Bug: ThreadLocalRandom

DOMANDA: Perché se provo a generare numeri casuali in Java 7 con la classe ThreadLocalRandom ottengo sempre gli stessi numeri ad ogni esecuzione? package numerirandomici; import java.util.concurrent.ThreadLocalRandom; public class RandomTest2 {     public static void main(String[] args) {       int random1 = ThreadLocalRandom.current().nextInt(1, 5); // da 1 (compreso) a 5 (escluso)       double random2 = ThreadLocalRandom.current().nextDouble(1, 5);  // da 1,00 (compreso) a 5,00 (escluso)       System.out.println(random1);       System.out.println(random2);    } } RISPOSTA: La classe ThreadLocalRandom , disponibile da Java 7 in poi, permette di generare i numeri casuali in maniera più efficiente rispetto al classico Math.random(). Il codice postato è corretto ma probabilmente hai installato la prima versione di Java 7. Purtroppo nella prima versione di Java 7 c'era un bug , risolto con l' update 2 sia del JRE che del JDK . Quindi basta scari

Numeri randomici in Java

DOMANDA: Come si generano i numeri casuali (random) in Java? RISPOSTA: Come in tutti i linguaggi di programmazione, in Java i numeri non sono realmente casuali , ma pseudo-randomici . La non reale randomicità è dovuta al fatto che è comunque tutto basato su un algoritmo matematico. Vediamo come generare dei numeri casuali da 1 a 1000: package numerirandomici; public class RandomTest1 { public static void main(String[] args) {       int random = ( int ) (Math.random()*1000+1);       System.out.println(random);    } } La spiegazione è semplice: Math.random() genera dei numeri casuali da 0 (compreso) a 1 (escluso). Il numero 1 costituisce il limite minimo dell'intervallo e 1000 quello massimo . Facciamo qualche esempio reale: - Math.random() genera 0,200. Moltiplicando 0,2 * 1000 otteniamo 200, sommando 1 abbiamo 201; -  Math.random() genera 0,220. Moltiplicando 0,14 * 1000 otteniamo 140, sommando 1 abbiamo 141; - Math.random() genera 0,000. Moltiplicando 0 *

Java: eventi personalizzati

DOMANDA: Come posso creare un evento personalizzato in Java? RISPOSTA: Oltre gli eventi normalmente forniti da Java è possibile creare dei propri eventi personalizzati .  Vediamo come attraverso questo esempio che scatena un evento ogni volta che cambiamo il timeout dell'oggetto Timer. Innanzitutto creiamo un evento TimerEvent (per essere un evento deve estendere la classe java.util.EventObject ): package eventipersonalizzati; import java.util.*; public class TimerEvent extends EventObject{     private static final long serialVersionUID = 1L;     public TimerEvent(Object sorgente){        super(sorgente);    } } Creiamo l'interfaccia del nostro listener ( ascoltatore in attesa di catturare gli eventi generati) chiamata TimerListener : package eventipersonalizzati; import java.util.EventListener; public interface TimerListener extends EventListener{    public void onTimerChange(TimerEvent timEv); } E la implementiamo in

Java Enumerations

DOMANDA: Esistono in Java le Enumerazioni? RISPOSTA: Si, anche in Java esistono gli enum Types (Enumerations) . Un enum type contiene un insieme di costanti . Vediamo subito un esempio di come creare un enum : public enum Coordinate {     NORD,    SUD,    OVEST,    EST } (n.b.: sono scritte in maiuscolo dato che sono delle costanti) Come si nota, per definire un'enumerazione basta la parola chiave enum . Un esempio di utilizzo dell' enum  precedente in  CoordinateTest : public class CoordinateTest {     public static void main(String args[]){        Coordinate c = Coordinate. NORD ; // input hardcoded         switch (c){           case NORD :                System.out.println( "Stai andando a NORD" );                 break ;           case SUD :                System.out.println( "Stai andando a SUD" );                 break ;           case EST :                System.out.println( "Stai andando a ES

Semplice message box

Immagine
DOMANDA: Come posso visualizzare facilmente una message box in Java? RISPOSTA: In Java esiste la classe statica JOptionPane che consente, con una sola riga di codice, la visualizzazione di una finestra in stile Windows . Tutto ciò è offerto gratuitamente da Java e, chi ha sviluppato interfacce grafiche con Swing , troverà questa scorciatoia davvero utile e snella. Esempio base Partiamo con il rendering di una semplice message box che visualizza il (classico) messaggio "Hello World!": import javax.swing.JOptionPane; public class MessageBox {      public static void main(String[] args) {           JOptionPane.showMessageDialog( null , "Hello World!" );      } } Il risultato ottenuto sarà il seguente: Finestra Message Dialog di JOptionPane

Java: definizione

DOMANDA: Che cos'è JAVA? Perché è così diffuso e ha avuto tanto successo? RISPOSTA: Per definire Java potrebbero bastare 2 parole come non potrebbero esserne sufficienti 10mila.  Proviamo a schematizzare cos'è e cosa non è Java . Cos'è JAVA: - è un linguaggio di programmazione ad oggetti che ha preso il nome di Java nel 1995 (in origine si chiamava OAK ); - è il risultato della fusione del C (sintassi) e C++ (logica ad oggetti) - è ibrido (compilato e interpretato) - è indipendente dalla piattaforma grazie alla JVM (Java Virtual Machine) - è estremamente diffuso anche perché permette di sviluppare quasi tutti i tipi di applicazioni - è un linguaggio che, rispetto ad altri più vecchi, permette di sviluppare applicazioni complesse in tempi minori - è supportato da colossi come (ORACLE/SUN, IBM, ...) - è gratuito - è documentato - è multithreading - ha la gestione automatica della memoria - ha una comunità enorme di progra

Java Reflection: come richiamare array di classi

DOMANDA: Ho seguito le istruzioni dell' altro post sulla Java Reflection e stavo modificando la classe RinominaFile in modo che avesse un costruttore aggiuntivo che prende in input come parametri due array di stringhe come nell'esempio qui di seguito: package reflection; import java.io.File; public class RinominaFile {     private String[] pathFrom;     private String[] newName;     public RinominaFile(String pathFrom, String newName) {       this .pathFrom[0] = pathFrom;       this .newName[0] = newName;    }     public RinominaFile(String[] pathFrom, String[] newName){       this .pathFrom = pathFrom;       this .newName = newName;    }    public void rinomina() {       for ( int i=0; i<pathFrom.length; i++){          File fromFile = new File(pathFrom[i]);          fromFile.renameTo( new File(newName[i]));       }    } } Così ho modificato la classe di Test: package reflection; import java.lang.reflect.Constructor; import java.lang.refle

Return Try/Catch e Finally

DOMANDA: Ho due return, uno all'interno del blocco try e uno nel finally: package ritornofinally; public class Ritorno {     public static boolean ritorno(){       boolean valore;       try {           valore = true ;           return valore;        } catch (Exception e) {           e.printStackTrace();        } finally {           return false ;        }    } } Quale dei due valori viene restituito? RISPOSTA: Facciamo un breve ragionamento logico per arrivare alla risposta. Il finally viene eseguito poco prima del rilascio del controllo sul try/catch , quindi, nel nostro caso subito prima del return contenuto all'interno del try (il " return valore" viene quindi lasciato in sospeso in attesa di terminare il finally ). Durante l'esecuzione del finally incontro un return che mi restituisce il controllo al chiamante ancor prima di eseguire il return contenuto nel blocco try . Quindi la risposta è che verrà restituito il va

Eseguire una classe a Runtime con Java Reflection

DOMANDA: Sto creando un programma che ha bisogno di lanciare dei metodi di altre classi Java a runtime. Come posso fare? RISPOSTA: L'idea che mi viene in mente è Java Reflection , una caratteristica potentissima di Java che permette di ottenere a runtime molte informazioni sulle classi (metodi e parametri, costruttori, attributi, ecc..., ecc...). Vediamo con l'esempio TestReflection come ispezionare una classe: package reflection; import java.lang.reflect.Constructor; import java.lang.reflect.Method; public class TestReflection {     public static void main(String[] args) throws ClassNotFoundException {       // la classe da analizzare       String classeDaInvocare = "java.lang.String" ;       Class classeInvocata = Class.forName(classeDaInvocare);           // elenco dei parametri dei vari costruttori       Constructor[] costruttori = classeInvocata.getConstructors();       for (Constructor c: costruttori){          Class[] parame

Creare file Microsoft Word .DOC e .DOCX con Apache POI

DOMANDA: Posso creare in Java un file Microsoft Word .DOC o .DOCX? RISPOSTA: Certamente. In Java è possibile creare un file .doc o .docx , estensione che identifica un documento Word (rispettivamente versione fino al 97-2003 e dal 2007 in poi), grazie alle librerie POI di Apache  (versione attuale 3.8). Vediamo con un esempio basilare come creare un .DOC  e un .DOCX con un paragrafo contenente una scritta: package doc; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFParagraph; import org.apache.poi.xwpf.usermodel.XWPFRun; public class CreaFileWord {    private String nomeFile;    public CreaFileWord(String nomeFile) {       this .nomeFile = nomeFile;    }    public void creaDoc() throws FileNotFoundException, IOException {       XWPFDocument doc = new XWPFDocument();       XWPFParag

Creare PDF con iText

DOMANDA: E' possibile creare in Java dei file PDF con dei contenuti personalizzati? RISPOSTA: In Java esistono diverse possibilità per creare PDF . Una di queste è utilizzare una libreria molto potente e di facile utilizzo di nome iText . Grazie a questa libreria (scaricabile da qui , la versione attuale è la 5.2.1) possiamo creare , aggiornare e leggere PDF utilizzando oggetti ad alto livello di astrazione, a basso livello o anche librerie grafiche ( PDFGraphics2D ). Addirittura iText supporta la crittografia . Oggi vi mostrerò un piccolissimo esempio di quanto sia facile creare dal nulla un PDF con questa libreria. Importiamo nel nostro progetto il file itextpdf-5.2.1.jar . La classe CreaPdf : package pdf; import java.io.FileOutputStream; import com.itextpdf.text.Document; import com.itextpdf.text.Paragraph; import com.itextpdf.text.pdf.PdfWriter; public class CreaPdf {       private String nome;     public CreaPdf(String name){      

Decomprimere file .zip

DOMANDA: Come decomprimere un file .zip in java? RISPOSTA: Java ci mette a disposizione numerosi strumenti per effettuare anche operazioni non proprio banali come la compressione e la decompressione di file. Dopo aver visto come comprimere , oggi vediamo come decomprimere un file .zip , in modo da estrarne il contenuto. La classe UnzipFile : package compressione; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; public class UnzipFile { private String zipPath; private String destPath; private final int BUFFER_SIZE = 4096;    // zipPath indica dove si trova il file    // destPat dove scompattarlo     public UnzipFile(String zipPath, String destPath) {       this .zipPath = zipPath;       this .destPa

Varargs Java: parametri a lunghezza variabile

DOMANDA: Ho bisogno di creare un metodo con firme multiple ( overloading ) che permetta di inserire da 0 a n parametri (come nell'esempio). C'è un modo per evitare di riscrivere sempre lo stesso metodo n volte? package varargs;    public class ParametriVariabili {       public void stampaParametri() {          System.out.println();       }       public void stampaParametri(String parametro) {           System.out.println(parametro);       }       public void stampaParametri(String parametro1, String parametro2) {          System.out.println(parametro1 + " " + parametro2);       }       public void stampaParametri(String parametro1, String parametro2, String parametro3) {          System.out.println(parametro1 + " " + parametro2 + " " + parametro3);       } } RISPOSTA: Se state usando una versione di Java inferiore alla 1.5 , l'unica soluzione è creare un metodo che prende in input un array (o qualsiasi

Stallo con Java process.waitFor()

DOMANDA: Nell'eseguire un programma esterno con Runtime.exec(), perché se uso il metodo process.waitFor() va tutto in stallo? package process; import java.io.IOException; public class ProcessTest {     public static void main(String[] args)                        throws IOException, InterruptedException {         Runtime runtime = Runtime.getRuntime();         Process process = runtime.exec( "cmd /C C:\\ffmpeg -i C:\\input.avi C:\\output.avi" );         process.waitFor();         System.out.println( "FINE" );     } } RISPOSTA: Eseguendo il codice della domanda, la stringa "FINE" non verrà mai eseguita. La causa del problema è la bufferizzazione di stdout e stderr . Infatti spesso capita che i dati in arrivo ai vari stream non siano sufficienti a riempire completamente i buffer. Quindi, finché i buffer non sono pieni, restano in attesa di input, lasciando il programma in stallo. La soluzione è quindi forzarne lo svuotamen

Caricamento di immagini

DOMANDA: Come posso caricare delle immagini in un'interfaccia grafica Java? RISPOSTA: Per caricare le immagini in un'interfaccia Java, è possibile utilizzare le classi JFrame , JPanel e  BufferedImage per effettuare il load vero e proprio. Questa soluzione è molto più adeguata e flessibile del caricamento di icone descritto in questo post .  Nell'esempio presentato vedremo infatti come posizionare l'immagine tramite variabili e come renderizzarla usando l'oggetto Graphics  che fornisce numerosi m etodi ed effetti applicabili alle BufferedImage (ad esempio la rotazione, traslazione, effetto trasparenza, e tanti altri). Cominciamo col creare un Pannello.java : package immagini; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; import javax.swing.JPanel; public class Pannello extends JPanel {