problem z wczytywaniem tekstu z pliku

0

Witam.

Piszę sobie prosty edytor tekstu, i wszystko szło całkiem ok do czasu gdy utknąłem jak chciałem żeby program otwierał pliki tekstowe. Program się kompiluje bez błędów, ale już w trakcie działania wywala błędy.

Oto fragmenty kodu.

W konstruktorze tworzę menu kontekstowe dzięki któremu można otworzyć plik

menuOpen = new JMenuItem("Open");
menuOpen.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, ActionEvent.CTRL_MASK));
menuOpen.addActionListener(new ActionListener()
    {
    public void actionPerformed(ActionEvent evt)
    {
        fileOpen();
    }
});
contextMenuMain.add(menuOpen);

Poza konstruktorem jest metoda która sprawdza czy aktualnie używany plik był nadpisany, zapisany itp. żeby zdecydować czy wyświetlić okienko z pytaniem czy zapisać zmiany:

public void fileOpen()
    {
        if (!textMain.getText().equals("")) // textMain to nazwa kontrolki JTextPane
        {
            if (fileName == "") // filename to String który przechowuje nazwę otworzonego pliku
            {
                dialogOption = JOptionPane.showConfirmDialog(null, "Do you want to save the changes?");
                if (dialogOption == 0)
                {
                    // saveAs
                    open2();
                }
                if (dialogOption == 1)
                {
                    open2();
                }
            }
            else
            {
                dialogOption = JOptionPane.showConfirmDialog(null, "Do you want to save the changes?");
                if (dialogOption == 0)
                {
                    // save();
                    open2();
                }
                if (dialogOption == 1)
                {
                    open2();
                }
            }
        }
        else
        {
            open2();
        }
    }

I jeszcze jedna metoda, ta właściwa do wczytywania tekstu:

public void open()
    {
        try
        {
            fstream = new FileInputStream(fileChooser.getSelectedFile().toString());
            in = new DataInputStream(fstream);
            br = new BufferedReader(new InputStreamReader(in));
            while ((strLine = br.readLine()) != null)
            {
                stringBuilder.append(strLine);
            }
            in.close();
            textMain.setText(stringBuilder.toString());
        }
        catch (IOException ioe)
        {
            JOptionPane.showMessageDialog(panelText, "IOException\n" + ioe.getMessage());
        }
    }

Jak już wcześniej wspominałem, program kompiluje się bez problemów. Ale gdy w czasie działania wybiorę i kliknę utworzone menu "Open" to NetBeans wywala mi coś takiego:

run:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at aplikacja.Aplikacja.open2(Aplikacja.java:582)
	at aplikacja.Aplikacja.fileOpen(Aplikacja.java:537)
	at aplikacja.Aplikacja$4.actionPerformed(Aplikacja.java:275)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
	at javax.swing.AbstractButton.doClick(AbstractButton.java:376)
	at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:833)
	at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:877)
	at java.awt.Component.processMouseEvent(Component.java:6505)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
	at java.awt.Component.processEvent(Component.java:6270)
	at java.awt.Container.processEvent(Container.java:2229)
	at java.awt.Component.dispatchEventImpl(Component.java:4861)
	at java.awt.Container.dispatchEventImpl(Container.java:2287)
	at java.awt.Component.dispatchEvent(Component.java:4687)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
	at java.awt.Container.dispatchEventImpl(Container.java:2273)
	at java.awt.Window.dispatchEventImpl(Window.java:2713)
	at java.awt.Component.dispatchEvent(Component.java:4687)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:707)
	at java.awt.EventQueue.access$000(EventQueue.java:101)
	at java.awt.EventQueue$3.run(EventQueue.java:666)
	at java.awt.EventQueue$3.run(EventQueue.java:664)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
	at java.awt.EventQueue$4.run(EventQueue.java:680)
	at java.awt.EventQueue$4.run(EventQueue.java:678)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:677)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
BUILD SUCCESSFUL (total time: 7 seconds)

at aplikacja.Aplikacja.open2(Aplikacja.java:582) - linijka fstream = new FileInputStream(fileChooser.getSelectedFile().toString());
at aplikacja.Aplikacja.fileOpen(Aplikacja.java:537) - open();
at aplikacja.Aplikacja$4.actionPerformed(Aplikacja.java:275) - fileOpen();

I nie mam pojęcia co się dzieje.
Gdybym w metodzie open() wstawił tylko
JOptionPane.showMessageDialog(panelText, "napis");
to okienko się pokaże, więc wszystkie wyższe metody działają ok, tylko tu coś się krzaczy.

Może im ktoś pomóc?

0

Rozumiem że ukradli ci debugger?
Skoro jest nullpointer tu:

new FileInputStream(fileChooser.getSelectedFile().toString());

to znaczy że albo fileChooser() jest nullem (na pewno go tworzysz?) albo żaden plik nie jest wybrany.

0

Dzięki za odpowiedź.
fileChooser jest utorzony a plik wybieram podwójnym kliknięciem.

Przepisałem metodę od nowa i w trochę inny sposób:

private void open()
    {
        fileChooser = new JFileChooser();
        ExampleFileFilter fileFilter = new ExampleFileFilter(".txt");
        fileChooser.addChoosableFileFilter(fileFilter);
        int returnValue = fileChooser.showDialog(null, "Open file...");
        stringBuilder = new StringBuilder();
        if (returnValue == JFileChooser.APPROVE_OPTION)
        {
            try
            {
                File plik = fileChooser.getSelectedFile();
                reader = new InputStreamReader(new FileInputStream(fileChooser.getSelectedFile().toString()), "UTF-8");
                br = new BufferedReader(reader);
                while ((strLine = br.readLine()) != null)
                {
                    stringBuilder.append(strLine + System.getProperty("line.separator"));
                }
                
                textMain.setText(stringBuilder.toString());
                this.setTitle(plik.getName());
            }
            catch(IOException ioe)
            {
                JOptionPane.showMessageDialog(panelText, "IOException\n" + ioe.getMessage());
            }
        }
    }

Program odczytuje pliki z polskimi znakami, ale pod warunkiem że używa się edytora innego niż windowsowy notepad.
Ale zawsze na początku mam taki znaczek:
user image

Czemu on się pojawia?

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