Java InputStream NullPointerException с InputStream - PullRequest
0 голосов
/ 19 апреля 2011

У меня есть два метода в классе:

  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.

1 Ответ

1 голос
/ 19 апреля 2011

Проблема в том, что вы глотаете исключения в getSongStream и возвращаете ноль.Не делайте этого - позвольте распространению исключения, возможно, обернув его в другую форму ... поэтому объявите, что ваш метод может выдать (скажем) IOException.Ваш downloadSong метод, вероятно, должен объявить, что он может также выдавать IOException.Обратите внимание, что у вас должны быть блоки finally, чтобы убедиться, что вы правильно закрыли свои потоки, даже если выдается исключение.

Это почти всегда плохая идея перехватить исключение, записать его в стандартный форматвывод, а затем продолжить, как будто все в порядке.

...