2012-06-22 12 views
6

ImageIO.write() एपीआई कॉल के साथ, मुझे NullPointerException मिलता है जब मैं "\\abc\abc.png" जैसे अस्तित्वहीन पथ को पास करता हूं। मैं जानबूझकर कुछ परीक्षण करने के लिए अस्तित्वहीन मार्ग पास करता हूं लेकिन FileNotFoundException प्राप्त करने के बजाय, मुझे NPE मिलता है। ऐसा क्यों है?"ImageIO.write()" एपीआई कॉल के साथ मुझे NullPointerException

ImageIO.write() एपीआई IOException फेंकने वाला है, लेकिन मुझे NPE क्यों नहीं मिलता है।

मैं उपयोगकर्ता को संदेश बॉक्स में दिखाने के लिए अपवाद संदेश स्ट्रिंग का उपयोग करता हूं लेकिन इस मामले में NPE.getLocalizedMessage() खाली स्ट्रिंग देता है और इसलिए पॉपअप बस उस पर एक आइकन के साथ खाली है।

+0

शेयर कोड जहां यह अपवाद कृपया – maksimov

+3

होता है कोई ImageIO.write() विधि तर्क के रूप में एक स्ट्रिंग पथ ले रहा है। हमें अपना कोड, और अपवाद का स्टैक ट्रेस दिखाएं। –

+0

इसके अलावा, आप अपना 'स्टैकट्रैक' भी दिखा सकते हैं। –

उत्तर

12

वह सही है, हालांकि। उदाहरण के लिए, इस कोड:

public static void main(String[] args) throws IOException { 
BufferedImage image = new BufferedImage(32, 32, BufferedImage.TYPE_INT_ARGB); 
File out = new File("\\\\ABC\\abc.png"); 
ImageIO.write(image, "png", out); 
} 

देता

java.io.FileNotFoundException: \\ABC\abc.png (The network path was not found) 
at java.io.RandomAccessFile.open(Native Method) 
at java.io.RandomAccessFile.<init>(RandomAccessFile.java:233) 
at javax.imageio.stream.FileImageOutputStream.<init>(FileImageOutputStream.java:69) 
at com.sun.imageio.spi.FileImageOutputStreamSpi.createOutputStreamInstance(FileImageOutputStreamSpi.java:55) 
at javax.imageio.ImageIO.createImageOutputStream(ImageIO.java:419) 
at javax.imageio.ImageIO.write(ImageIO.java:1530) 
at javaapplication145.JavaApplication145.main(JavaApplication145.java:24) 
Exception in thread "main" java.lang.NullPointerException 
at javax.imageio.ImageIO.write(ImageIO.java:1538) 
at javaapplication145.JavaApplication145.main(JavaApplication145.java:24) 

कारण यह है कि FileImageOutputStreamSpi.createOutputStreamInstance FileNotFoundException निगल और फिर एनपीई आता है जब ImageIO.write की कोशिश करता एक धारा है कि नहीं खुला था बंद करने के लिए है।

अपवाद को इतनी क्रूरता से क्यों दबाया जाता है, मुझे नहीं पता। कोड टुकड़ा

try { 
return new FileImageOutputStream((File)output); 
} catch (Exception e) { 
e.printStackTrace(); 
return null; 
} 

है एकमात्र समाधान ImageIO उपयोग करने के लिए प्रयास करने से पहले पथ सत्यापित करने के लिए है।

+0

क्या केवल NullPointerException को पकड़ना बेहतर नहीं होगा? और अन्य अपवाद पेड़ ऊपर जाने दें। – TinusSky

1

मुझे इस धागे में उल्लिखित मुद्दे के लिए एनपीई का कारण पता चला। पीटर हुल

public static void main(String[] args) throws IOException { BufferedImage image = new BufferedImage(32, 32, BufferedImage.TYPE_INT_ARGB); File out = new File("\\\\ABC\\abc.png"); ImageIO.write(image, "png", out); } 

यह बिल्कुल सही है कि यह मेरा कोड दिखता है। हाइलाइट करने के लिए धन्यवाद पीटर।

इस समस्या का कारण यह है कि नया फ़ाइल इमेजऑटपुटस्ट्रीम() एक फ़ाइल नॉटफाउंड अपवाद फेंकता है लेकिन कुछ सूर्य प्रोग्रामर गए और अपवाद पकड़ा, स्टैक ट्रेस मुद्रित किया, और शून्य वापस लौटा दिया। यही कारण है कि FileNotFoundException को पकड़ना अब संभव नहीं है - यह पहले से ही मुद्रित है। इसके तुरंत बाद, लौटा हुआ शून्य मूल्य एक NullPointerException का कारण बनता है, जिसे मैं जिस विधि से बुलाया जाता है उसे फेंक दिया जाता है। अपवाद के स्टैक ट्रेस को मुद्रित करते समय, मैं ऊपर उल्लिखित कारणों के लिए FileNotFoundExceptionएनपीई के साथ देख सकता था।

-Nayan