Olá

Hoje me deparei com um erro diferente ao tentar conectar ao banco de dados Oracle numa aplicação Java.

Caused by: java.sql.SQLException: Io exception: NL Exception was generated

Depois de algumas analises verifiquei que a string de conexão estava errada:


jdbc:oracle:thin:@(DESCRIPTION=(LOAD_BALANCE=on)(FAILOVER=on)(ADDRESS_LIST=(ADDRESS=(protocol=tcp)(host=198.31.10.51)(port=1521))(ADDRESS=(protocol=tcp)(host=198.31.10.50)(port=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=meu_banco))

No final da string faltou um fecha parênteses “)”.

Abaixo string que funciona sem problemas:


jdbc:oracle:thin:@(DESCRIPTION=(LOAD_BALANCE=on)(FAILOVER=on)(ADDRESS_LIST=(ADDRESS=(protocol=tcp)(host=198.31.10.51)(port=1521))(ADDRESS=(protocol=tcp)(host=198.31.10.50)(port=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=meu_banco)))

portanto quando ocorrer esse erro verifique sua string nos mínimos detalhes.

Até mais,

Olá

Trabalhar com arquivos no Java7 ficou muito mais fácil com a introdução da classe java.nio.file.Files. Com esta classe copiar, mover, apagar e outras operações básicas ficaram muito simples.
A seguir veremos alguns exemplos:
O trecho abaixo obtém o sistemas de arquivos padrão acessível pela JVM.

 FileSystem defaultFS = FileSystems.getDefault();

Agora criamos um objeto da classe Path que representa o diretório D:\java

Path basePath = defaultFS.getPath("D:\\", "java"); 

Os objetos Path podem referenciar diretórios e arquivos.

Path temp1 = basePath.resolve("temp1"+
              File.separator + "meu_arquivo.txt");
			Path temp2 = basePath.resolve("temp2");

Usamos a classe Files para criar o diretório com o método estático createDirectories()

Files.createDirectories(temp2); 

Abaixo copiamos o arquivo para outro diretório substituindo caso exista.

Files.copy(temp1, temp2,
                StandardCopyOption.REPLACE_EXISTING ); 

Para move o arquivo para outro diretório substituindo caso exista usamos o código abaixo.

Files.move(temp1, temp3.resolve("fim.txt"),
                StandardCopyOption.REPLACE_EXISTING); 

Para saber se o arquivo existe

System.out.println("File exists " + Files.exists(temp1)); 

Mostramos o tamanho do arquivo em bytes

System.out.println(Files.size(temp2) + " bytes"); 

O código abaixo lista os diretórios raízes, no windows retornaria C:\, D:\, E:\ etc.

FileSystem defaultFS = FileSystems.getDefault();
		Iterable<Path> rootDirectories = defaultFS.getRootDirectories();

		for(Path pth : rootDirectories){
			System.out.println(pth.toString());
		}

Para mim a API foi bem escrita, é bem auto-explicativa.
Por enquanto minha ressalva é quanto as permissões no padrão POSIX, achei elas complicadas de serem aplicadas.

Antes de ter a classe Files para copiar um arquivo geralmente faríamos:

FileInputStream in =
                 new FileInputStream("D:\arquivo.txt");
            FileOutputStream out = new FileOutputStream("D:\destino.txt");
            byte[] buf = new byte[1024];
            int i = 0;
            while ((i = in.read(buf)) != -1) {
                out.write(buf, 0, i);
            }
            in.close();
            out.close(); 

No Java 7 não precisa dar close nos recursos que implementam java.lang.AutoCloseable. Assim você não corre mais riscos de esquece preso um recurso.

Até mais,
Roberto

Olá,

Instalei o Java 7 para testar alguns novos recursos.
Link para download

Vamos aos dois mais básicos, porém muito úteis.

1. switch
Agora no Java 7 é possível fazer switch de Strings.
Como sempre, o comando é case-sensitive.

public class Java7 {

	public static void main(String [] args){

	  String cor = "azul";

	  switch(cor){

		  case "verde":
		  System.out.println("Cor verde");
		  break;

		  case "amarelo":
		  System.out.println("Cor amarelo");
		  break;

		  case "azul":
		  System.out.println("Cor azul");
		  break;

		  case "Azul":
		  System.out.println("Cor Azul");
		  break;

		  default:
		  System.out.println("Cor indefinida");
		  break;
	  }
	}
}

Nesse exemplo a saída seria: Cor azul

2. catch múltiplos
Nessa versão é possível com uma única declaração de catch “pegar” várias exceções.
Basta separar as exceções por pipe “|”.

import java.io.*;

public class Java7 {
	public static void main(String [] args){
		try {
			 FileInputStream fis = new FileInputStream("arquivo.txt");

			 DataInputStream dis = new DataInputStream(fis);
			 BufferedReader br = new BufferedReader(new InputStreamReader(dis, "UTF-8"));
			 String linha;

			  while ((linha = br.readLine()) != null){
				System.out.println (linha);
			  }			

		} catch(IOException | NullPointerException exc){
		  System.out.println("Deu erro " + exc);
		}
	}
}

As exceções declaradas no catch não podem ser mãe e filha (subclasse).
Se por exemplo declarássemos:

catch(IOException | FileNotFoundException | UnsupportedEncodingException exc)

Teríamos o seguinte erro na compilação:

Java7.java:16: error: Alternatives in a multi-catch statement cannot be related
by subclassing
                } catch(IOException | FileNotFoundException | UnsupportedEncodin
gException exc){
                                      ^
  Alternative FileNotFoundException is a subclass of alternative IOException
Java7.java:16: error: Alternatives in a multi-catch statement cannot be related
by subclassing
                } catch(IOException | FileNotFoundException | UnsupportedEncodin
gException exc){
                                                              ^
  Alternative UnsupportedEncodingException is a subclass of alternative IOExcept
ion
2 errors

até mais,

Olá

Esse post é só uma dica para você que usa o SimpleDateFormat para converter String em Date.
Não sei por que razão (para falar a verdade também não pesquisei) mas o SimpleDateFormat não lança uma exceção quando passamos um data que não existe no calendário. Por exemplo 31 de setembro e 32 de setembro. Ele simplesmente converte para um dia do próximo mês.

Veja os exemplos abaixos:

    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
    System.out.println(sdf.parse("30/09/2011"));
    System.out.println(sdf.parse("31/09/2011"));
    System.out.println(sdf.parse("32/09/2011"));

    // Saídas
    // Fri Sep 30 00:00:00 BRT 2011
    // Sat Oct 01 00:00:00 BRT 2011
    // Sun Oct 02 00:00:00 BRT 2011

Dica do Tadashi:
Para validar a data use o método setLenient(false)

Dessa forma um ParseException será lançada!

Até mais,
Roberto

Olá

Programinha para identificar valores RGB e gerar imagens pixel a pixel pelo valor RGB.

import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.WritableRaster;
import java.io.File;
import java.io.IOException;
import java.util.*;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.event.*;  

public class IdentificadorRGB extends JFrame implements MouseMotionListener {  

   private JLabel l_imagem, l_red, l_green, l_blue, l_r, l_g, l_b;
   private BufferedImage imagem,
   img_red, img_blue, img_green;
   Container c;  

   IdentificadorRGB() {
      super("Identificador de valores RGB pixel a pixel");
      try {
         //Leitura da imagem do disco
         imagem = ImageIO.read(new File("imagem.png"));
         img_blue = ImageIO.read(new File("imagem.png"));
         img_red = ImageIO.read(new File("imagem.png"));
         img_green = ImageIO.read(new File("imagem.png"));
      } catch (IOException e) {
         e.printStackTrace();
      }
      getContentPane().setLayout(null);
      c = getContentPane();  

      l_r = new JLabel();
      l_r.setBounds(300, 0, 270, 185);
      c.add(l_r);  

      l_g = new JLabel();
      l_g.setBounds(300, 190, 270, 185);
      c.add(l_g);  

      l_b = new JLabel();
      l_b.setBounds(5, 245, 270, 185);
      c.add(l_b);  

      l_imagem = new JLabel();
      l_imagem.setIcon(new ImageIcon(imagem));
      l_imagem.setBounds(0, 0, 270, 185);
      c.add(l_imagem);  

      l_red = new JLabel();
      l_red.setText("R:");
      l_red.setBounds(5, 190, 100, 15);
      c.add(l_red);  

      l_green = new JLabel();
      l_green.setText("G:");
      l_green.setBounds(5, 210, 100, 15);
      c.add(l_green);  

      l_blue = new JLabel();
      l_blue.setText("B:");
      l_blue.setBounds(5, 225, 100, 15);
      c.add(l_blue);  

      WritableRaster raster = imagem.getRaster();
      int pixels[] = new int[4];
      for (int i = 0; i < imagem.getWidth(); i++)
         for (int j = 0; j < imagem.getHeight(); j++) {
            raster.getPixel(i, j, pixels);
            img_red.setRGB(i, j, setR(pixels[0] ));
            img_green.setRGB(i, j, setG(pixels[1] ));
            img_blue.setRGB(i, j, setB(pixels[2] ));  

         }  

      c.validate();
      l_r.setIcon(new ImageIcon(img_red));
      l_g.setIcon(new ImageIcon(img_green));
      l_b.setIcon(new ImageIcon(img_blue));
      addMouseMotionListener(this);
      setSize(600, 500);
      setResizable(false);
      show();
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  

   }
   /* métodos que transforma valores inteiros do RGB para um numero hexadecimal
    *
    * Por exemplo 255,000,255  fica em hexadecimal 0x00FF00FF
    *
    * O dois primeiros 00 são valores do ALPHA que é responsavel pela
    * transparencia
    *     *
    */
   private int setR(int r) {
      return 0
         << 24
            | ((r << 16) & 0x00FF0000)
            | ((0 << 8 ) & 0x0000FF00)
            | (0 & 0x000000FF);
   }
   private int setG(int g) {
      return 0
         << 24
            | ((0 << 16) & 0x00FF0000)
            | ((g << 8 ) & 0x0000FF00)
            | (0 & 0x000000FF);
   }
   private int setB(int b) {
      return 0
         << 24
            | ((0 << 16) & 0x00FF0000)
            | ((0 << 8 ) & 0x0000FF00)
            | (b & 0x000000FF);
   }  

   public static void main(String[] args) {
      new IdentificadorRGB();
   }  

   public void mouseDragged(MouseEvent arg0) {
   }  

   public void mouseMoved(MouseEvent arg0) {  

      WritableRaster raster = imagem.getRaster();
      int pixels[] = new int[4];
      if (arg0.getX() < imagem.getWidth()
         && arg0.getY() < imagem.getHeight()) {
         raster.getPixel(arg0.getX() - 3, arg0.getY() - 23, pixels);
         //Mostras os valores na tela
         l_red.setText("R: " + pixels[0] );
         l_green.setText("G: " + pixels[1] );
         l_blue.setText("B: " + pixels[2] );
      }
   }  

}