2017-11-14 26 views
0

내 프로그램 (자바를 사용하여 Java)을 설정하여 이미지를 찾는 경우 한 가지 작업을 수행하고 그렇지 않은 경우 다른 작업을 설정하려고합니다. ..ImageIO를 사용하여 BufferedImage가 'null'을 선택하는지 테스트하는 방법

이것은 내가 지금까지 가지고있는 것이지만 else 문을 완성하지 못합니다. 나는 "이미지"는 기술적으로 null이 아니기 때문에 여전히 파일 이름이 입력 된 것과 일치하므로 믿습니다. 그러나 파일 이름이 디렉토리 내에없는 경우 java를 설정하는 방법을 잘 모르겠습니다. 사람이 좀 도와 수 있다면 당신은 예외를 삼키는하고

+2

파일을 읽을 수 없거나 존재하지 않으면'ImageIO.read'는'IOException'을 던집니다. 개인적으로, 예를 들어,'ImageIO.read'에 의존하여'File # exists'를 사용합니다. – MadProgrammer

답변

2

public void displayImage(String strfilename, JLabel JLlabel) { 

    try { 
     JLabel label = JLlabel; 

     String FileName = strfilename; 
     BufferedImage image = ImageIO.read(new File(FileName + ".jpg")); 
     if(image!=null){ 
     ImageIcon icon = new ImageIcon(image); 

     label.setIcon(icon);} 
     else{ 
     BufferedImage image2 = ImageIO.read(new File("NOIMAGE.jpg")); 
     ImageIcon icon2 = new ImageIcon(image2); 
     label.setIcon(icon2); 
     } 
    } catch (IOException ioe) { 
    } 
} 

나는 매우 감사하게 될 것입니다. try {} catch {}가 이미 있으므로 if {} else {} 루프가 필요 없습니다.

String FileName = file; 
try { 
    BufferedImage image = ImageIO.read(new File(FileName + ".jpg")); 
    // Code for when the image is found 
} catch (IOException ex) { 
    // Code for when the image is not found 
} 

편집 : @haraldK 지적 , 당신은 NullPointerException이가 발생 될 경우에는 존재하지만 읽을 수있는 파일을 가질 수 있습니다.

두 항목 모두 catch 절에서 처리 할 수 ​​있습니다.

public void displayImage(String strfilename, JLabel label) { 
    try { 
     BufferedImage image = ImageIO.read(new File(strfilename + ".jpg")); 
     ImageIcon icon = new ImageIcon(image); // Can throw NullPointerException if the file is found but is unreadable 
     label.setIcon(icon); 

    } catch (IOException | NullPointerException ex) { 
     ImageIcon icon = new ImageIcon("NOIMAGE.jpg"); 
     label.setIcon(icon); 
    } 
    // You're probably going to have to pack or validate your container here 
} 

주목할 가치가있는 점 중 하나는 NOIMAGE에 대한 예외를 확인하지 않는다는 것입니다. 추가해야 할 수도 있습니다.

File.exists()는 파일이 있지만 읽을 수없는 파일 (텍스트 파일 및 기타 파일)을 처리하기 때문에 File.exists()를 호출하는 것보다 낫습니다.

+0

'ImageIO.read()'는'null'을 반환하므로'if/else'가 필요할 수도 있습니다. 이미지를 읽을 수 없습니다 (알 수없는 형식). – haraldK

+0

나는 당신이 말하는 것을 얻지 만,이 경우 파일 확장자는 .jpg로 하드 코드됩니다. – Touniouk

+0

파일 확장자 == 파일 형식이라고 가정하면 그럴 것입니다. 하지만 텍스트 파일 인 .jpg를 어떻게 만들었습니까? 'ImageIO.read()'는 예외를 던지지 않지만'null'을 반환합니다. 사용자 입력을 신뢰하지 마십시오. ;-) – haraldK

1

이 방법을 처리하기 전에 파일이 있는지 확인할 수 있습니다. 또한 불필요한 코드를 제거했습니다.

public void displayImage(String strfilename, JLabel JLlabel) { 
// declare only one reference you don't need two references 

BufferedImage image=null; 

if(!isImageExist(strfilename)){ 
// assign the NOIMAGE if image not found 
image = ImageIO.read(new File("NOIMAGE.jpg"));  
} else { 

    try { 
     // assign the image if found 
     image = ImageIO.read(new File(strfilename + ".jpg")); 

    } catch (IOException ioe) { 
     ioe.printStackTrace(); 
    } 
} 
    ImageIcon icon = new ImageIcon(image); 
    //setting the image once instead of repeating the code in if and else blocks also you don't need to add another reference to JLlabel because you are already got it from a parameter 
    JLlabel.setIcon(icon); 
} 
private boolean isImageExist(String imageName) { 
return new File(imageName.jpg).exist(); 
}