Erro JDBC – Io exception: NL Exception was generated
14/setembro/2011 - Java, Oracle
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,
Trabalhando com arquivos no Java 7
30/agosto/2011 - Java
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
Java7 – Switch com String e multi-catch
21/agosto/2011 - Java
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,
Cuidado com parse de String para Date
17/agosto/2011 - Java
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
Lendo valores RGB de uma imagem com java
19/fevereiro/2011 - Java
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] );
}
}
}
