Почему при вызове метода он говорит, что мне нужно перехватить исключение, когда я его уже перехватил? - PullRequest
0 голосов
/ 08 июня 2018

У меня есть класс, который зацикливает аудио:

public class PlayGameMusic {
    public static void main(String[] args) throws Exception {
        try{
            AudioInputStream inputStream = AudioSystem.getAudioInputStream(new File("\\Users\\natal\\Desktop\\programs\\APCS\\Fill the Boxes.wav"));
            Clip clip = AudioSystem.getClip();
            clip.open(inputStream);
            clip.loop(Clip.LOOP_CONTINUOUSLY);
            Thread.sleep(10000);
        }
        catch(IOException error){System.out.println("IO Exception Error");}
        catch(InterruptedException error){System.out.println("InterruptedException");}
        catch(Exception error){System.out.print("System.out.println("Exception");");}
     }
}

Я могу скомпилировать этот метод, и компилятор не сообщает об ошибках (я проверял это с помощью операторов print).Тем не менее, когда я пытаюсь вызвать основной метод вышеупомянутого класса (PlayGameMusic) в другом классе ...

public class RunGame
{
    public static void main(String[] args)
    {
       PlayGameMusic.main(null);
    }
}

... я получаю эту ошибку компилятора:

unreported exception java.lang.Exception; must be caught or declared to be thrown

Я улавливаю возможные исключения, и класс PlayGameMusic работает сам по себе.Почему я не могу позвонить из другого класса?

Ответы [ 3 ]

0 голосов
/ 08 июня 2018

Если PlayGameMusic.main не может выбросить Exception, то оно не должно быть объявлено с throw Exception.Он не должен иметь throw Exception только потому, что может генерировать и ловить Exception.

0 голосов
/ 08 июня 2018

Если метод вызывает другой метод, который явно выбрасывает Exception, то вызывающий метод должен перехватить это Exception или объявить, что он выбрасывается в собственной сигнатуре метода

https://docs.oracle.com/cd/A97339_01/doc/bc4j/BC4JRuntimeFiles/obcExceptions.htm

0 голосов
/ 08 июня 2018

Вы объявили свой main в PlayGameMusic, чтобы бросить Exception.Даже если ничего в этом методе на самом деле не выбрасывает Exception из метода, вы должны перехватить его или объявить его в вызывающем методе, например, RunGame.main.

Поскольку вы перехватываете исключения в PlayGameMusic.main,вам не нужно объявлять, что это бросает что-либо.В PlayGameMusic измените:

public static void main(String[] args) throws Exception

на

public static void main(String[] args)
...