2011-04-19 76 views
0

我有一类两种方法:的Java的InputStream NullPointerException异常随同InputStream

private static InputStream getSongStream(String ip, String id){ 
     try { 
     URL url = new URL("http://"+ ip + "/" + Client.streamphp); 
     URLConnection conn = url.openConnection(); 
     conn.setDoOutput(true); 

     OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream()); 
     wr.write(data); //Data is a simple Http Post that is know to work 
     wr.flush(); 
     wr.close(); 

     return conn.getInputStream(); 

    } catch (MalformedURLException badurl) { 
     System.out.println(badurl); 
     return null; 
    } catch (IOException noconnection) { 
     System.out.println(noconnection); 
     return null; 
    } 
    } 

    public static void downloadSong(String ip, String id, String path){ 
     InputStream rd = Client.getSongStream(ip, id); 
     try { 
      OutputStream stream = new FileOutputStream(new File(path)); 

      byte[] buffer = new byte[4096]; 
      int len; 
      while ((len = rd.read(buffer)) > 0) { //Here I get NullPointerException 
      stream.write(buffer, 0, len); 
      } 
      stream.close(); 
      rd.close(); 

    } catch (IOException noconnection) { 
      System.out.println(noconnection); 
     } 
    } 

在第二种方法评价该生产线的问题,如果我把所有相同的方法,我可以下载歌曲,而不问题,但如果我将它们分开,则不会。

任何想法?我想让它们分开以重用getSongStream。

+0

也许RD是空的...检查此 – Tobias 2011-04-19 09:16:49

回答

1

问题是,你在吞咽异常getSongStream并返回null。不要这样做 - 让异常传播,可能已经用另一种形式包装了它......所以声明你的方法可以抛出(比如说)IOException。你的downloadSong方法可能应该声明它也可以抛出IOException。请注意,即使发生异常,您也应该终止块以确保适当地关闭流。

这几乎是总是一个坏主意,以捕获一个异常,写出标准输出,然后继续进行,如果一切正常。