I would stick to throwing an unchecked exception.
The reason is it is not up to calling objects to validate your object. Furthermore, pulling the loading logic to a separate method means calling code must know to call method A before method B, and potentially method A can/should only be called once. This is a sequencing anti-pattern.
In this case, I prefer lazy loading which if done correctly ensures A. that loading is done only once, B. calling code does not need to know that methods in your class should be called in a specific order, potentially breaking if they do not.
Pseudocode:
public object getObject() {
if (this.data == null) {
loadObject()
}
return this.data
}
private void loadObject() {
// Expensive loading logic...
}
Edit: I would like to clarify that getters/accessors should, generally, not throw anything. However, in this case, we are not dealing with a simple getter. I like to think of this not as "get some simple variable stored on the object" but "go get me some beer from the fridge, and if there are none left, throw a NullPointerException." After all if you are getting a value from some binary file or whatever, are you going to set it too? Probably not. So maybe another question is "should this be called a 'getter' to begin with?" which is a separate question.