2009-07-19 2 views
0

У меня есть следующий тест JUnit:PMD правило DataflowAnomalyAnalysis нечетность

@Test 
public void testRunLocalhost() throws IOException, InterruptedException { 
    // Start an AnnouncerThread 
    final AnnouncerThread announcer = new AnnouncerThread(); 
    announcer.start(); 

    // Create the socket and listen on the right port. 
    final DatagramSocket socket = new DatagramSocket(); 
    assert(socket != null); 

    // Create a packet to send. 
    final DatagramPacket packet = new DatagramPacket(new byte[0], 0, InetAddress.getByName(AnnouncerThread.GROUP), AnnouncerThread.PORT); 
    assert(packet != null); 

    // Send the packet. 
    socket.send(packet); 

    // Listen for the IP from the server. 
    final DatagramPacket receivedPacket = new DatagramPacket(new byte[256], 256); 
    socket.setSoTimeout(2000); // Only wait 2 seconds. 
    socket.receive(receivedPacket); 
    socket.close(); 

    // Get localhost's address. 
    final InetAddress localhost = InetAddress.getLocalHost(); 
    assert(localhost != null); 

    // Compare the receive IP to the localhost IP. 
    final String receivedIP = new String(receivedPacket.getData()); 
    if (!receivedIP.startsWith(localhost.getHostAddress())) { 
     fail("Received IP: '" + receivedIP + "' not the same as localhost: '" + localhost.getHostAddress() + "'"); 
    } 

    announcer.shutdown(); 
    announcer.join(); 
} 

И PMD дает следующие нарушения:

Found 'UR'-anomaly for variable 'socket' (lines '36'-'36'). 
Found 'UR'-anomaly for variable 'localhost' (lines '36'-'36'). 
Found 'UR'-anomaly for variable 'packet' (lines '36'-'36'). 

Line 36 в моем файле есть строка метода определяется:

public void testRunLocalhost() throws IOException, InterruptedException { 

Я не понимаю, что говорят нарушения. Где я должен определить эти три переменные? Почему в нарушениях не был анонимник? Это объявлено так же, как я пробовал переупорядочить объявления безрезультатно.

ответ

3

Кажется, что он имеет какое-то отношение к вызовам assert, которые вы делаете сразу после выделения этих трех конечных переменных.

Документах PMD (http://pmd.sourceforge.net/rules/controversial.html#DataflowAnomalyAnalysis) говорят:

UR - Anomaly: Существует ссылка на переменную, которая не была определена до

+0

Удаление Assert избавились от нарушений. –

+0

- это ошибка в PMD? –

+0

Да, 'DataflowAnomalyAnalysis' довольно устарел. Эта конкретная проблема с утверждениями была [недавно исправлена ​​и будет частью PMD 6.0.0] (https://github.com/pmd/pmd/pull/420), но есть еще [куча нерешенных проблем] (https : //github.com/pmd/pmd/labels/in%3Adata-flow) – Johnco

0

Это выглядит довольно странно. Интересно, что это происходит для всех трех переменных, которые определены для объектов, выделенных с помощью «new», которые затем проверяются на нуль. Я ожидал бы, что результат «нового» всегда будет действительным/не-нулем - в противном случае нужно выбросить OutOfMemoryException. Интересно, это проблема?

Смежные вопросы