throws와 throw 둘 다 Exception을 발생시킨다는 것에는 차이가 없다. 하지만 둘 사이의 차이점은 아래와 같다
현재 메서드에서 자신을 호출한 상위 메서드로 Exception을 발생 시킨다.
즉, throws 키워드는 사용하는 메서드를 호출한 상위 메서드에서 이러한 에러 처리에 대한 책임을 맡게 되는 것이다.
예외를 전가시키는 것( 예외를 자신이 처리하지 않고, 자신을 호출하는 메소드에게 책임을 전가하는 것)
억지로 에러를 발생시키고자 할 때 사용되기도 하고 현재 메소드의 에러를 처리한 후에
상위 메소드에 에러 정보를 줌으로써 상위 메서드에서도 에러가 발생한 것을 감지할 수 있다.
즉, throw는 개발자가 exception을 강제로 발생시켜 메서드 내에서 예외처리를 수행하는 것이다.
다시 보면 throw를 통해 발생한 exception을 catch에서 발견한 경우 더이상의 exception에 대한 정보는 존재하지 않는다.
하지만 catch문에서 다시 throw를 통한 인위적인 exception을 발생시켰고, 이를 onAction() 메서드가 받아서 상위 메서드인
main()으로 전달하게 된다. 따라서 catch문의 마지막에 exception을 추가로 발생시킨 경우 onAction()에 throws 키워드를 사용하지 않으면
컴파일 에러가 발생한다.
Reference
https://jhkim2017.wordpress.com/2017/04/24/java-throws%EC%99%80-throw%EC%9D%98-%EC%B0%A8%EC%9D%B4/