A production quality program should use one of the many logging alternatives (e.g. log4j, logback, java.util.logging) to report errors and other diagnostics. This has a number of advantages:
- Log messages go to a configurable location.
- The end user doesn't see the messages unless you configure the logging so that he/she does.
- You can use different loggers and logging levels, etc to control how much little or much logging is recorded.
- You can use different appender formats to control what the logging looks like.
- You can easily plug the logging output into a larger monitoring / logging framework.
- All of the above can be done without changing your code; i.e. by editing the deployed application's logging config file.
By contrast, if you just use printStackTrace, the deployer / end user has little if any control, and logging messages are liable to either be lost or shown to the end user in inappropriate circumstances. (And nothing terrifies a timid user more than a random stack trace.)