Remaining doclint issues in java.net

Stuart Marks stuart.marks at oracle.com
Thu Aug 1 14:18:01 PDT 2013


On 7/31/13 2:39 PM, Matthew Hall wrote:
> On Wed, Jul 31, 2013 at 02:38:26PM -0700, Stuart Marks wrote:
>> The alternative is to add "@throws SocketException never" to the
>> javadoc, just to get rid of the doclint warning, but this has the
>> consequence of requiring people to keep dead code around
>> indefinitely, and furthermore it requires them to add new dead code
>> every time they create a DatagramPacket.
>
> I have never understood in many years using Java why the compiler generates
> errors about attempting to catch supposedly-impossible exceptions, instead of
> warnings.
>
> For me it only leads to difficulties when I'm trying to write prototypes or
> refactor and clean up some old brittle code, and I run into that rather
> dubious sort of error.
>
> This is a good example of where it causes more harm than good. Is there still
> a really good reason for this over-paranoid compiler error given that checked
> exceptions aren't as popular as they used to be anyways?

I don't have the definitive answer, but it was a very early Java design 
decision to make unreachable code be a compilation error instead of a warning. 
This is a matter of judgment, of course; reasonable people come down on 
different sides of this, for different cases. For example, see this 
Stackoverflow conversation:

http://stackoverflow.com/questions/3795585/why-does-java-have-an-unreachable-statement-compiler-error

* * *

Meanwhile, I did a little bit of studying about DatagramPacket. The doclint 
warnings occur on two of the six DatagramPacket constructors:

     DatagramPacket(byte[] buf, int len, SocketAddress sa)
     DatagramPacket(byte[] buf, int off, int len, SocketAddress sa)

There are two other equivalent overloaded constructors that take InetAddress 
and port arguments:

     DatagramPacket(byte[] buf, int len, InetAddress ia, int port)
     DatagramPacket(byte[] buf, int off, int len, InetAddress ia, int port)

To my eye the InetAddress/port constructors are used quite a bit more often 
than the SocketAddress ones. I did a web search for "java DatagramPacket 
example" and looked at all the examples on the first page of hits. All of them 
used the InetAddress+port constructor overloads (including the Oracle Java 
tutorial). I didn't see any uses of the SocketAddress overloads.

I also did an ohloh search for "new DatagramPacket(":

http://code.ohloh.net/search?s=%22new%20DatagramPacket%28%22&p=2&pp=0&fl=Java&mp=1&ml=1&me=1&md=1&ff=1&filterChecked=true

(HT: Dalibor)

I looked through around 100 examples, and the vast majority of them use the 
InetAddress+port overloads. I saw three examples that use the SocketAddress 
overloads. Two of them were within methods that declared "throws Exception." 
The third was within a try/catch block that catches IOException. None of the 
three cases would suffer a source incompatibility.

This isn't definitive, of course, but it does seem to supply some evidence that 
making this change would result in a relatively minor source incompatibility.

s'marks



More information about the net-dev mailing list