Sometimes your code should work whether a binding exists or not. In these cases, you can use @Inject(optional=true) and Guice can override your default implementation with a bound implementation when available. For example:
@Inject(optional=true) Formatter formatter = new DefaultFormatter();
If someone creates a binding for Formatter, Guice will inject an instance from that binding. Otherwise, assuming Formatter isn't injectable itself (see Implicit Bindings), Guice will skip the optional member.
Optional injection applies only to fields and methods, not constructors. In the case of methods, if a binding for one parameter is missing, Guice won't inject the method at all, even if bindings to other parameters are available.