don't use NPE, throw IllegalStateException