Post

JSP Error: IllegalStateException

DOMANDA: Quando provo ad effettuare il forward o il sendRedirect di una JSP ad un'altra risorsa ottengo queste IllegalStateException: con il forward: java.io.IOException: Error: Attempt to clear a buffer that's already been flushed java.lang.IllegalStateException: Error: Attempt to clear a buffer that's already been flushed con il sendRedirect: java.lang.IllegalStateException    at org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:438) RISPOSTA: Inserendo questa riga di codice all'inizio della JSP si risolve il problema: <%@ page autoFlush =" true " buffer =" 1094kb " %>    Vi starete chiedendo perché.  Bene, cerchiamo di spiegarlo brevemente. Quando si inoltra una request ad un'altra risorsa con un forward o un sendRedirect() si ottiene una IllegalStateException qualora la response (o parte di essa) fosse già stata inviata al client. Quindi, quando otteniamo questo errore è molt

Enumerare le interfacce di rete e loro caratteristiche

DOMANDA: Come posso creare un elenco delle interfacce di rete con le relative caratteristiche? RISPOSTA: Rispondo subito con un esempio chiarificatore nella classe ElencoInterfacceDiRete : package interfaccedirete; import java.net.Inet4Address; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.util.Enumeration; public class ElencoInterfacceDiRete {    public static void main(String args[]) throws SocketException {       Enumeration<NetworkInterface> interfaces =              NetworkInterface.getNetworkInterfaces();       while (interfaces.hasMoreElements()) {          NetworkInterface netInterf = interfaces.nextElement();          Enumeration<InetAddress> indirizzi = netInterf.getInetAddresses();           while (indirizzi.hasMoreElements()) {             InetAddress inetAddress = indirizzi.nextElement();             System.out.println( "Nome Interfaccia:" + netInterf.get

Java 7: Gestione delle Suppressed Exceptions nel try-with-resources

DOMANDA: Cosa sono e come si gestiscono le Suppressed Exceptions in un try-with-resources? RISPOSTA: Nei post precedenti abbiamo visto lo statement try-with-resources e come creare oggetti autochiudenti grazie alle novità introdotte con Java 7 . Un particolare comportamento delle eccezioni introdotto con il try-with-resources è quello delle Suppressed Exceptions . Come già intuibile dal nome, sono delle eccezioni soppresse dalla JVM. Guardiamo subito un esempio di una risorsa AutoCloseable che lancia due eccezioni, una generica Exception in chiusura e una IOException nel metodo faiQualcosa (): package trywithresources; import java.io.IOException; public class PrimaRisorsa implements AutoCloseable{    public PrimaRisorsa() {       System.out.println( "COSTRUISCO LA RISORSA" );    }    public void faiQualcosa() throws IOException {       System.out.println( "PrimaRisorsa: Faccio qualcosa" );       throw new IOException( &quo

Java 7: Autocloseable e Closeable Objects

DOMANDA: Cosa sono gli oggetti AutoCloseable e Closeable? RISPOSTA: Java 7 ha introdotto una comoda caratteristica che è il try-with-resources di cui abbiamo parlato abbondantemente in questo post . Gli oggetti AutoCloseable e Closeable sono delle classi che implementano rispettivamente java.lang.AutoCloseable e java.io.Closeable . L'unico metodo che l'interfaccia obbliga ad implementare è il close() , chiamato alla fine del blocco try-with-resources . Oltre a tutti gli oggetti che da Java 7 implementano già questa interfaccia, è possibile rendere le proprie classi " autochiudenti " semplicemente implementandola a nostra volta. Guardiamo l'esempio: package trywithresources; public class PrimaRisorsa implements AutoCloseable{    @Override    public void close() throws Exception {       System.out.println( "CHIUDO PrimaRisorsa" );    } } E ora vediamo come funziona con un Test : package trywithresources; import j

Java 7: Statement try-with-resources

DOMANDA: Che cos'è lo Statement try-with-resources introdotto con il rilascio di Java 7? RISPOSTA: Una delle problematiche più comuni ai programmatori è la sistematica chiusura delle risorse e/o connessioni aperte. Capita spesso, infatti, che per dimenticanza o meglio per errori e/o eccezioni impreviste non gestite al meglio, alcune risorse rimangano in attesa di una chiusura che non arriverà mai. Per prevenire questi memory leaks  da Java 7 è stato introdotto lo statement try-with-resources che si occupa di chiudere automaticamente le risorse aperte. Guardiamo come funziona: public String leggiRigaDaFile(String path) throws IOException {     try (BufferedReader br =                     new BufferedReader( new FileReader(path))) {         return br.readLine();     } } La novità è che c'è un blocco try (in questo caso senza catch e finally ) con uno o più argomenti tra parentesi. Questi parametri rappresentano un oggetto risorsa che Java garant

Immagini cliccabili

DOMANDA: Come posso creare un'immagine cliccabile che mostra un messaggio? RISPOSTA: Una maniera efficiente, soprattutto se le immagini sono piccole, è quella di utilizzare i JButton a cui applicare l'immagine desiderata tramite ImageIcon . Dopo di che si apre tramite JOptionPane un dialog che mostra il messaggio definito. Da notare come l'implementazione dell' ActionListener sia una inner class. Se dovesse diventare più complessa, si può spostare in una classe a parte. Vediamo com'è implementata la logica del programma con la classe ImageDialog : package immagini; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JOptionPane; public class ImageDialog {    private JFrame frame ;    public ImageDialog(JFrame frame) {   this . frame = frame;    }    public JButton generateButton(String filename, int x, in

Arrotondamento e troncamento in Java

DOMANDA: Facendo le divisioni tra numeri float o double mi escono cifre decimali lunghissime. Come si arrotonda o si tronca un numero in Java? RISPOSTA: Un esempio in cui questo problema si presenta in modo massivo è durante lo sviluppo applicazioni che hanno a che fare con le valute . Java mette a disposizione differenti metodi di arrotondamento e troncamento per soddisfare un po' tutte le esigenze. Una possibile soluzione ( parziale ) è l'utilizzo della libreria java.lang.Math , in particolare dei suoi 4 metodi elencati di seguito (ricordiamo che Math contiene solo static ): FLOOR - double floor(double d): questo metodo, come si evince dal nome " floor " ( pavimento ) arrotonda il numero alla cifra intera inferiore (il cosiddetto arrotondamento per difetto o troncamento). ESEMPI : double floor(4.4) -> restituisce 4. double floor(4.6) -> restituisce 4. CEIL - double ceil(double d): questo metodo, al contrario di floor si