InvocationTargetException

0

Mam dwie prawie identyczne klasy - jedna jest w pakiecie domyślnym, druga zawiera instrukcję

package bs.utils;

W konstruktorze obu klas jest fragment

        File file = new File(helpFile);
        if(!file.exists())
        {
            ok = false;
        }
        if(ok)
        {
            try
            {
                url = new URL("file:" + helpFile);
            }
            catch(Exception e)
            {
                //komunikat o błędzie
                ok = false;
            }
        }
        if(ok)
        {
            urls.add(url);
            setLayout(new BorderLayout(2,2));
            ep.setEditable(false); //ep jest typu JEditorPane
            ep.addHyperlinkListener(this);
            try
            {
                ep.setPage(url);
            }
            catch (Exception e)
            {
            }
       }

Klasa z pakietu domyślnego działa poprawnie, a ta druga rzuca w wierszu

ep.setPage(url);

wyjątkiem wymienionym w tytule postu.
Ma ktoś pomysł co jest przyczyną?

0

Wrzuć stacktrace (i to cąłego z cause) to zobaczym.

0

Proszę bardzo

java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
        at javax.swing.JEditorPane.getStream(Unknown Source)
        at javax.swing.JEditorPane.setPage(Unknown Source)
        at bs.utils.HelpHtml.<init>(HelpHtml.java:67)
        at bs.math.trajektorie.Trajectories.createHelpPanel(Trajectories.java:29
5)
        at bs.math.trajektorie.Trajectories.<init>(Trajectories.java:147)
        at bs.math.trajektorie.Trajectories.main(Trajectories.java:138)
Caused by: java.lang.reflect.InvocationTargetException
        at java.awt.EventQueue.invokeAndWait(Unknown Source)
        at java.awt.EventQueue.invokeAndWait(Unknown Source)
        at javax.swing.SwingUtilities.invokeAndWait(Unknown Source)
        ... 6 more
0

To ciekawe.
Bo kod EventQueue mówi, że ten InvocationTargetException ma na pewno dalsze Exception (kolejne caused by)
Root cause?

0

Co jeszcze chciałbyś zobaczyć?
Pominąłem fragment

Caused by: java.lang.Error: java.io.FileNotFoundException: c:\Program Files\java\jdk1.8.0_40\lib\tzdb.dat (Nie można odnaleźć określonego pliku)
	at sun.util.calendar.ZoneInfoFile$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at sun.util.calendar.ZoneInfoFile.<clinit>(Unknown Source)
	at sun.util.calendar.ZoneInfo.getTimeZone(Unknown Source)
	at java.util.TimeZone.getTimeZone(Unknown Source)
	at java.util.TimeZone.setDefaultZone(Unknown Source)
	at java.util.TimeZone.getDefaultRef(Unknown Source)
	at java.util.TimeZone.getDefault(Unknown Source)
	at java.text.SimpleDateFormat.initializeCalendar(Unknown Source)
	at java.text.SimpleDateFormat.<init>(Unknown Source)
	at sun.net.www.protocol.file.FileURLConnection.initializeHeaders(Unknown Source)
	at sun.net.www.protocol.file.FileURLConnection.getHeaderField(Unknown Source)
	at sun.net.www.URLConnection.getContentType(Unknown Source)
	at javax.swing.JEditorPane.handleConnectionProperties(Unknown Source)
	at javax.swing.JEditorPane.access$300(Unknown Source)
	at javax.swing.JEditorPane$3.run(Unknown Source)
	at java.awt.event.InvocationEvent.dispatch(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$500(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
Caused by: java.io.FileNotFoundException: c:\Program Files\java\jdk1.8.0_40\lib\tzdb.dat (Nie można odnaleźć określonego pliku)
	at java.io.FileInputStream.open0(Native Method)
	at java.io.FileInputStream.open(Unknown Source)
	at java.io.FileInputStream.<init>(Unknown Source)
	... 30 more
can't open c:\Program Files\java\jdk1.8.0_40\lib\tzmappings.

Moim zdaniem pominięty fragment jest nieistotny - brak wymienionych plików nie przeszkadza w uruchomieniu żadnego programu, który nie zawiera klasy bs.utils.HelpHtml.

0

Java to nie demokracja - twoje zdanie nie ma znaczenia.

W każdym razie trudno dyskutować z faktem - skoro pisze caused by i przez to się wywalił to znaczy, że to JEST przyczyna błędu.
(może nie jedyna, może poboczna, ale jest ).

0

Jasno napisane jest, że błąd wynika z problemu w dostępie do tzdb.dat. Dziwne, że tylko w jednym przypadku. Spróbuj użyć tego:
http://www.oracle.com/technetwork/java/javase/downloads/tzupdater-download-513681.html
I najlepiej daj też cały kod tych klas.

0

@jarekr000000 i @Jaca777
jakie znaczenie podczas uruchamiania programów ma zawartość katalogu c:\Program Files\java\jdk1.8.0_40...?
brakujące pliki miałem w katalogu c:\Program Files\java\jdk1.8.0_40\jre\lib,
po skopiowaniu do katalogu c:\Program Files\java\jdk1.8.0_40\lib, komunikat się zmienił:

Caused by: java.lang.InternalError: Currency data format is incorrect
        at java.util.Currency$1.run(Unknown Source)
        at java.util.Currency$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.util.Currency.<clinit>(Unknown Source)
        at java.text.DecimalFormatSymbols.initialize(Unknown Source)
        at java.text.DecimalFormatSymbols.<init>(Unknown Source)
        at sun.util.locale.provider.DecimalFormatSymbolsProviderImpl.getInstan
(Unknown Source)
        at java.text.DecimalFormatSymbols.getInstance(Unknown Source)
        at sun.util.locale.provider.NumberFormatProviderImpl.getInstance(Unkno
 Source)
        at sun.util.locale.provider.NumberFormatProviderImpl.getIntegerInstanc
Unknown Source)
        at java.text.NumberFormat.getInstance(Unknown Source)
        at java.text.NumberFormat.getInstance(Unknown Source)
        at java.text.NumberFormat.getIntegerInstance(Unknown Source)
        at java.text.SimpleDateFormat.initialize(Unknown Source)
        at java.text.SimpleDateFormat.<init>(Unknown Source)
        at sun.net.www.protocol.file.FileURLConnection.initializeHeaders(Unkno
 Source)
        at sun.net.www.protocol.file.FileURLConnection.getHeaderField(Unknown
urce)
        at sun.net.www.URLConnection.getContentType(Unknown Source)
        at javax.swing.JEditorPane.handleConnectionProperties(Unknown Source)
        at javax.swing.JEditorPane.access$300(Unknown Source)
        at javax.swing.JEditorPane$3.run(Unknown Source)
        at java.awt.event.InvocationEvent.dispatch(Unknown Source)
        at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
        at java.awt.EventQueue.access$500(Unknown Source)
        at java.awt.EventQueue$3.run(Unknown Source)
        at java.awt.EventQueue$3.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectio
rivilege(Unknown Source)
        at java.awt.EventQueue.dispatchEvent(Unknown Source)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.run(Unknown Source)

W klasie Trajectories jest wywołanie konstruktora

helpPanel = new HelpHtml("resources/SystemyHelp.html","Opis programu",new Dimension(800,600),true,"resources",this);

Klasa HelpPanel wygląda tak:

package bs.utils;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.io.File;
import java.net.URL;
import java.util.ArrayList;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JToolBar;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;
import javax.swing.text.Document;
import javax.swing.text.html.HTMLDocument;
import javax.swing.text.html.HTMLFrameHyperlinkEvent;

public class HelpHtml extends JFrame implements HyperlinkListener
{
    private static final long serialVersionUID = 1L;
    private JEditorPane ep = new JEditorPane();
    private JButton back;
    private JButton forward;
    private JButton home;
    private JButton refresh;
    private ArrayList<URL> urls = new ArrayList<URL>();
    private int currentUrl = 0;
    private URL url = null;
    private String subdirectory = "resources";
    private boolean ok = true;
    //------------------------
    public HelpHtml(String fileName, String title, Dimension dimension, boolean navigationBar, String subdirectory, Component component)
    {
        setTitle(title);
        this.subdirectory = subdirectory;
        String helpFile = System.getProperty("currentUser.dir",".") + "/" + fileName;
        File file = new File(helpFile);
        if(!file.exists())
        {
            ok = false;
        }
        if(ok)
        {
            try
            {
                url = new URL("file:" + helpFile);
            }
            catch(Exception e)
            {
                My.say(e.getMessage(),component);
                ok = false;
            }
        }
        if(ok)
        {
            urls.add(url);
            setLayout(new BorderLayout(2,2));
            ep.setEditable(false);
            ep.addHyperlinkListener(this);
            try
            {
                ep.setPage(url);
            }
            catch (Exception e)
            {
                My.say(e.getMessage(),component);
                e.printStackTrace();
                ok = false;            	
            }
        }
        if(ok)
        {
            JScrollPane sp = new JScrollPane(ep);
            sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
            sp.setPreferredSize(dimension);
            ep.setDocument((HTMLDocument)ep.getDocument());
            add(sp,BorderLayout.CENTER);
            if(navigationBar)
            {
                createToolBar();
            }
            pack();
        }
        setVisible(false);
    }
    //---------------------------
    public HelpHtml(String fileName, String title, Dimension dimension, boolean navigationBar)
    {
        this(fileName, title, dimension, navigationBar, "resources", null);
    }
    //---------------------------
    public HelpHtml(String fileName, String title, Dimension dimension)
    {
        this(fileName, title, dimension, true);
    }
    //---------------------------
    public HelpHtml(String fileName, String title)
    {
        this(fileName, title, new Dimension(800,600), true);
    }
    //---------------------------
    public HelpHtml(String fileName)
    {
        this(fileName, "Objaśnienia", new Dimension(800,600), true);
    }
    //---------------------------
    private void createToolBar()
    {
        back = new JButton(new ImageIcon(subdirectory + "/Back.gif"));
        forward = new JButton(new ImageIcon(subdirectory + "/Forward.gif"));
        home = new JButton(new ImageIcon(subdirectory + "/Home.gif"));
        refresh = new JButton(new ImageIcon(subdirectory + "/Refresh.gif"));

        JToolBar tb = new JToolBar();
        back.setToolTipText("Wstecz");
        back.addActionListener(e -> back());
        back.setEnabled(false);
        tb.add(back);

        forward.setToolTipText("Naprzód");
        forward.addActionListener(e -> forward());
        forward.setEnabled(false);
        tb.add(forward);

        home.setToolTipText(url.toString());
        home.addActionListener(e -> home());
        home.setEnabled(false);
        tb.add(home);

        refresh.setToolTipText("Odświeżenie");
        refresh.addActionListener(e -> refresh());
        refresh.setEnabled(true);
        tb.add(refresh);

        add(tb,BorderLayout.NORTH);
    }
    //---------------------------
    public boolean isOk()
    {
        return ok;
    }
    //---------------------------
    public void hyperlinkUpdate(HyperlinkEvent e)
    {
        if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED)
        {
            if (e instanceof HTMLFrameHyperlinkEvent)
            {
                HTMLFrameHyperlinkEvent evt = (HTMLFrameHyperlinkEvent)e;
                HTMLDocument doc = (HTMLDocument)ep.getDocument();
                doc.processHTMLFrameHyperlinkEvent(evt);
            }
            else
            {
                try
            {
                    URL newUrl = e.getURL();
                    ep.setPage(newUrl);

                    if(currentUrl == urls.size()-1)
                    {
                        urls.add(newUrl);
                        currentUrl++;
                        setButtons();
                        return;
                    }
                    if(newUrl.equals(urls.get(currentUrl+1)))
                    {
                        currentUrl++;
                        setButtons();
                        return;
                    }
                    for(int i=currentUrl;i<urls.size();i++)
                    {
                        if(i > 0)
                        {
                            urls.remove(i);
                        }
                    }
                    urls.add(newUrl);
                    currentUrl++;
                    setButtons();
                }
                catch (Throwable t)
                {
                    My.showStack(t,10);
                }
            }
        }
    }
    //------------------------
    private void back()
    {
        try
        {
            ep.setPage(urls.get(currentUrl - 1));
            currentUrl--;
            setButtons();
        }
        catch(Throwable t)
        {
            My.showStack(t,10);
        }        
    }
    //------------------------
    private void forward()
    {
        try
        {
            ep.setPage(urls.get(currentUrl+1));
            currentUrl++;
            setButtons();
        }
        catch(Throwable t)
        {
            My.showStack(t,10);
        }        
    }
    //------------------------
    private void home()
    {
        try
        {
            ep.setPage(url);
            currentUrl = 0;
            setButtons();
        }
        catch(Throwable t)
        {
            My.showStack(t,10);
        }        
    }
    //------------------------
    private void refresh()
    {
        try
        {
            Document doc = ep.getDocument();
            doc.putProperty(Document.StreamDescriptionProperty,null);
            ep.setPage(urls.get(currentUrl));
            setButtons();
        }
        catch(Throwable t)
        {
            My.showStack(t,10);
        }
    }
    //------------------------
    private void setButtons()
    {
        if(urls.size() <= 1)
        {
            back.setEnabled(false);
            home.setEnabled(false);
            forward.setEnabled(false);
        }
        else
        {
            if(currentUrl == 0)
            {
                back.setEnabled(false);
                home.setEnabled(false);
                forward.setEnabled(true);
                return;
            }
            if(currentUrl == urls.size() - 1)
            {
                back.setEnabled(true);
                home.setEnabled(true);
                forward.setEnabled(false);
                return;
            }
            back.setEnabled(true);
            home.setEnabled(true);
            forward.setEnabled(false);
        }
    }
}
0

java.home (JAVA_HOME) jakie masz jest niezgodne z java na którym uruchamiasz i nie zgadza się format/ wersja pliku currency.data
cos masz ostro naknocone w wersjach java.
ale jak sobie kopiujesz coś sam do java/lib no to dziwnym nie jest

Zainstaluj te jdk od nowa i to nowe,a nie jakieś _40. Jesteś programistą czy kolekcjonerem staroci?

0

Pliki skopiowałem pół godziny temu, bo Java szukała ich nie w tym katalogu, w którym były.

0

Odinstalowałem stare Javy, zainstalowałem JDK 1.8.131, ustawiłem zmienne środowiskowe

JAVA_HOME=c:\Program Files\java\jdk1.8.0_131
JRE_HOME=c:\Program Files\java\jre1.8.0_131

Działanie (niedziałanie) programów nie uległo żadnej zmianie. W komunikacie o błędzie zmienił się tylko katalog (na c:\Program Files\java\jdk1.8.0_131\lib).

0

Ok. Jak ty to odpalasz. Z palca ? Z Eclipsa / Intellij?

0

Przepraszam za przerwę, przez kilka dni byłem odcięty od komputera.
Uruchamiam na dwa sposoby, Eclipse i wiersz poleceń (z pliku jar). Objawy są identyczne.
Uzyskałem dzisiaj dostęp do komputera, zainstalowałem JDK i JRE 1.8.131 (żadnego IDE nie instalowałem), uruchomiłem program z wiersza poleceń i poszedł.
Zmienne środowiskowe JRE_HOME i JAVA_HOME ustawiłem identycznie jak na komputerze domowym, plików tzdb.db oraz tzmappings nie ma w katalogu c:\Program Files\Java\jdk1.8.0_131\lib i żadnego komunikatu o ich braku nie ma.

0

Przyczyna jest chyba po stronie JVM. W katalogu ...jdkxxx/lib znajduje się plik tools.jar, w katalogu ...jrexxx/lib znajdują się pliki tzdb.dat, tzmappings i currency.data. Jeżeli program korzysta z pliku tools.jar (a mój korzysta), to wymienione pliki muszą być w jednym katalogu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1