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
Fatorial com Oracle SQL
05/julho/2011 - Oracle
Olá
Abaixo um SQL diferente que calcula o fatorial de um número
with fatorial as
(select level idx from dual connect by level <= 15)
select idx, exp( sum( ln(idx) ) over (order by idx) ) fact
from fatorial
Resultado:

Resultado da query
Eu achei interessante, pois alguns comandos ali eu nunca tinha visto apesar de trabalhar a bastante tempo com Oracle DB.
Até mais.
ORA-01722: invalid number
13/março/2011 - Oracle
Olá,
Se você usa o to_number() para converter varchar2 em number provavelmente já teve esse problema ou um dia terá.
O problema aparenta ser simples quando tem uma variável varchar2 com caracteres estranhos no meio, mas e quando você tem certeza que o número esta certo. E quando to_number() funciona corretamente só quando o número é inteiro .
Essa dor de cabeça aparece quando tem o separador de decimal e/ou de milhar, que é diferente conforme a localização usada. Geralmente usamos o ponto, que é o normal para programadores. Mas o oracle pode te pegar de calças curtas.
Vamos usar a simples query abaixo para demonstrar o problema
select to_number('3.1415', '9D9999'), 1/2 from dual;
Rode a query abaixo para saber as configurações da sessão atual.
select *
from v$nls_parameters
where parameter in
('NLS_LANGUAGE', 'NLS_CHARACTERSET');
Se retornar isso:
PARAMETER VALUE 1 NLS_LANGUAGE BRAZILIAN PORTUGUESE 2 NLS_CHARACTERSET WE8ISO8859P1
A query de exemplo vai retornar erro: ORA-01722: invalid number
SQL> select to_number('3.1415', '9D9999'), 1/2 from dual;
select to_number('3.1415', '9D9999'), 1/2 from dual
*
ERROR at line 1:
ORA-01722: invalid number
Se trocarmos o ponto pela vírgula vai funcionar perfeitamente
SQL> select to_number('3,1415', '9D9999'), 1/2 from dual;
TO_NUMBER('3,1415','9D9999') 1/2
---------------------------- ----------
3,1415 ,5
Para funcionar com ponto, o NLS_LANG deve ser o AMERICAN_AMERICA.WE8ISO8859P1, mostrado abaixo:
PARAMETER VALUE 1 NLS_LANGUAGE AMERICAN 2 NLS_CHARACTERSET WE8ISO8859P1
Desse forma se usarmos o ponto vai funcionar.
SQL> select to_number('3.1415', '9D9999'), 1/2 from dual
2 ;
TO_NUMBER('3.1415','9D9999') 1/2
---------------------------- ----------
3.1415 .5
Com esse post demonstrei que o cliente é que manda, não sei tem como o DBA travar isso, mas pelo menos nos bancos que eu acesso tem essa característica.
Para alterar esse comportamento no linux basta usar o export para criar a variável NLS_LANG
export NLS_LANG="BRAZILIAN PORTUGUESE_BRAZIL.WE8ISO8859P1" export NLS_LANG="AMERICAN_AMERICA.WE8ISO8859P1"
No windows vá nas propriedades do sistema, aba avançado e clique no botão variáveis de ambiente. Utilize o botão novo para criar uma nova variável, coloque no nome NLS_LANG e o valor que desejar.
Até mais,
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] );
}
}
}
