Java :Обработчик необработанных исключений Mysterious Java [с кодом]

Произошло что-то странное. Я написал программу на Java, в которой я ничего не сделал для обработки неперехваченных исключений каким-либо особым образом. Но когда я запускаю эту конкретную программу в Windows 7, возникает неперехваченное исключение в статическом контексте, вызываемом из main, которое вызывает всплывающее окно, отображающее исключение. Я пытался написать небольшую программу для дублирования этого эффекта, но безрезультатно. Одна программа (, которую я написал полностью вручную ), создает всплывающее окно, в то время как никакие другие этого не сделают.

Я хотел бы отследить это, в частности, чтобы я мог добавить код, который заставляет другие исключения CAUGHT отображать трассировку стека аналогичным образом.

Я спрашивал об этом в IRC, но люди говорят мне, что этого не происходит. Что ж, это ДЕЙСТВИТЕЛЬНО произошло. Ниже приведен скриншот.

Я думаю, что моя единственная надежда, если кто-то еще признает это и может сказать мне, откуда это взялось.

Спасибо!

Java exception

ОБНОВЛЕНИЕ :Приносим извинения за задержку с кодом. Мне пришлось ухаживать за младенцем, страдающим коликами. Обратите внимание, что это настольное Java-приложение. Это не апплет, и он не использует веб-старт.

Вот код, скопированный и вставленный из программы, которая получает диалог. Я сделаю еще одно редактирование, чтобы вы знали, получает ли мой коллега (, получивший исключение ), диалоговое окно для этого случая. Я постарался включить все, что привело к исключению.Отсутствует только реализация класса IPAddress, но она не участвует в исключении, поскольку фактически не используется до тех пор, пока не возникнет исключение. Обратите внимание на звездочки перед строкой, в которой возникает исключение. Эта строка кода соответствует исключению, которое вы видите на скриншоте.

package staticexception;

import java.net.InterfaceAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.List;
import javax.swing.UIManager;

public class StaticException {
    // Don't need this fully implemented.
    public static class IPAddress {

        public static IPAddress getBroadcast(IPAddress mask, IPAddress myip) {
            return new IPAddress();
        }

        public IPAddress() {}

        public IPAddress(int maskval) {}

        public IPAddress(byte[] addr) {}

        public IPAddress mask(IPAddress netmask) {
            return this;
        }

        public int prefixLength() {
            return 0;
        }

    }

    public static class Network {
        public IPAddress broadcast, netmask, ip;
        boolean remember;

        public Network(IPAddress br, IPAddress nm, IPAddress ip) {
            broadcast = br;
            netmask = nm;
            this.ip = ip;
        }

        boolean match(IPAddress ip) {
            IPAddress a = ip.mask(netmask);
            IPAddress b = this.ip.mask(netmask);
            return (a.equals(b));
        }

        @Override
        public String toString() {
            return ip.toString() + "/" + netmask.prefixLength();
        }
    }

    static List<Network> my_networks;

    static void enumerateNetworks() {
        my_networks = new ArrayList<Network>();

        Enumeration<NetworkInterface> nets = null;
        try {
            nets = NetworkInterface.getNetworkInterfaces();
        } catch (SocketException ex) {
            ex.printStackTrace();
        }
        for (NetworkInterface netint : Collections.list(nets)) {
            for (InterfaceAddress address : netint.getInterfaceAddresses()) {
                // *** Exception would occur on the next line when 
                // *** address.getAddress() would return null
                byte[] addr = address.getAddress().getAddress();
                if (addr.length == 4 && addr[0] != 127) {
                    int prefixlen = address.getNetworkPrefixLength();
                    int maskval = -1 << (32 - prefixlen);
                    IPAddress mask = new IPAddress(maskval);
                    //my_netmask = mask;
                    System.out.println("Netmask   = " + mask);

                    IPAddress myip = new IPAddress(addr);
                    //my_ip_address = myip;
                    System.out.println("Local IP  = " + myip);

                    IPAddress broadcast = IPAddress.getBroadcast(mask, myip);
                    System.out.println("Broadcast = " + broadcast);

                    my_networks.add(new Network(broadcast, mask, myip));

                    System.out.print(address.getAddress().getAddress().length + " ");
                    System.out.print(address.getAddress() + " ");
                    System.out.print(address.getAddress().getHostAddress() + " ");
                    System.out.println(address.getNetworkPrefixLength());
                }
            }
        }
    }

    static private void setupNetwork() {
        System.setProperty("java.net.preferIPv4Stack","true");

        enumerateNetworks();

        //... stuff that would happen after the exception
    }

    public static void main(String[] args) {
        try {         
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());     
        } catch (Exception e) {}

        setupNetwork();

        //... stuff that would happen after the exception
    }
}

ВТОРОЕ ОБНОВЛЕНИЕ :Мой коллега сообщает, что эта программа НЕ создает диалог. Единственная разница между этим и программой, которая вызывает всплывающее окно -, заключается в том, что программа, которая вызывает всплывающее окно -, запускается из оболочки exe, созданной AdvancedInstaller. Кроме того, внутри Java-программы последовательность выполнения идентична. Я гуглил это, и, насколько я могу найти, AdvancedInstaller вообще ничего не делает, что привело бы к созданию этого всплывающего окна -. Я не уверен, что это МОЖЕТ быть выполнено без модификации Java-программы (, чего не происходит ), потому что я не уверен, что вы можете сделать что-то вне Java-программы, чтобы это произошло. За исключением, возможно, захвата stderr, но это не объясняет, почему другие программы, упакованные AdvancedInstaller, не создают это всплывающее окно -up или почему более поздние исключения, создаваемые этим приложением, также не создают это всплывающее окно -.

8
задан Timothy Miller 31 July 2012 в 19:36
поделиться