Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > unreported exception java.io.IOException


Автор: Elene 11.11.2004, 20:00
Подскажите, пожалуйста, как решить проблему с unreported exception java.io.IOException.

Есть класс:
Код

import java.io.*;
import java.util.*;

public class Bdd
{
private HashMap fabricants;  //fabricants
private Set jeux;    //jeux


public Bdd () {
  fabricants = new HashMap();
  Comparator comp = new JeuxTree();
  jeux = new TreeSet(comp);
}


public Bdd (HashMap fabricants, Set jeux) {
 this.fabricants = fabricants;
 this.jeux = jeux;
}
...
}


В нем есть методы для инициализации каждого члена, которые сами по себе прекрасно справляются со своей задачей. Привожу первый:
Код

public void lireBddsFabr(String nomFichierFab)  throws IOException
{

 //Verification si base de donees est deja chargee si oui, on l'efface

 if(!fabricants.isEmpty()) fabricants.clear();

 //On lire le fichier .txt
 FileReader frFabr = null;
 boolean existeFileFabr = true;
 boolean finFichierFabr = false;
 String nomFileFabr = nomFichierFab;
 try
 {
  frFabr = new FileReader(nomFileFabr);
 }
 catch (java.io.FileNotFoundException e)
 {
  System.out.println("Probleme d'ouvrir le fichier " + nomFileFabr);
  existeFileFabr = false;
 }

 if (existeFileFabr)
 {
  BufferedReader entreeFabr = new BufferedReader (frFabr);

  while (!finFichierFabr)
  {
   String codeFab = entreeFabr.readLine();

   if (codeFab != null)
   {
    String nom = entreeFabr.readLine();
    String siege = entreeFabr.readLine();
    int i = siege.indexOf(", ");
    String ville = siege.substring(0, i );
    String pays = siege.substring(i + 2);
    int anne = Integer.parseInt(entreeFabr.readLine());
    String endFabr = entreeFabr.readLine();

    Fabricant fabr = new Fabricant(nom, ville, pays, anne);
    fabricants.put(codeFab, fabr); //On rempli le map
   }
   else finFichierFabr = true;
  }
  entreeFabr.close();
 }
   }


Есть второй класс, который использует GUI, в котором есть объект класса Bdd, и в котором есть меню, кликнув на JMenuItem, которого я должна вызвать ту самую описанную выше методу lireBddsFabr(String nomFichierFab):
Код

public void actionPerformed(ActionEvent e)
  {
    String actionCommand = e.getActionCommand();

...
else if (e.getSource() instanceof JMenuItem)
    {
  if ("BdD de Fabricants".equals(actionCommand)){

   FileDialog boiteFichier = new FileDialog(this, "Ouverture de : ",FileDialog.LOAD);
   boiteFichier.show();
   String nomFichier = boiteFichier.getFile();

   bdDonnees.lireBddsFabr(nomFichier);
  }
...
}
...
}


Вот тут-то на строчке bdDonnees.lireBddsFabr(nomFichier); и появляется:
unreported exception java.io.IOException; must be caught or declared to be thrown bdDonnees.lireBddsFabr(nomFichier);
А я совершенно не понимаю, что я должна исправить. Объясните, пожалуйста.





Автор: LSD 11.11.2004, 20:09
Это ошибка времени компиляции, которая возникает когда компилятор обнаруживает возможность возникновения "контролируемых" ошибок в коде, и не находит обработчик для данной ошибки или декларирования возможности ее возникновения. В данной ситуации есть два варианта:
1) окружить bdDonnees.lireBddsFabr(nomFichier); try...catch
Код
try
{
 bdDonnees.lireBddsFabr(nomFichier);
}
catch(IOException ex)
{
// Обрабатываем ошибку
}

2) декларировать ошибку как "кидаемую"
Код
public void actionPerformed(ActionEvent e) throws IOException
...



Автор: Elene 11.11.2004, 20:16
Спасибо.

Автор: Domestic Cat 11.11.2004, 20:17
Цитата
2) декларировать ошибку как "кидаемую"


actionPerformed не можеt бросать иксепшн, поскольку метод, который делает оверрайд метода суперкласса (интерфейса) ne mожет бросать иксепшны, не объявленныe при декларации методa суперкласса.

Автор: LSD 11.11.2004, 20:24
Значит пункт 2 вычеркиваем smile (из данного примера, а вообще он тоже применим)

Автор: Elene 11.11.2004, 20:35
Только теперь я получила еще более страшную ошибку:
actionPerformed(java.awt.event.ActionEvent) in Tp21 cannot implement actionPerformed(java.awt.event.ActionEvent) in java.awt.event.ActionListener; overridden method does not throw java.io.IOException
public class Tp21 extends JFrame implements ActionListener
^
Как дальше быть?

Добавлено @ 20:36
Ура!!! Я вычеркнула и все заработало. Большое спасибо!!!

Автор: Domestic Cat 11.11.2004, 20:39
этo был второй способ kоторый не сработал smile делай как в пункте 1).

Автор: Elene 11.11.2004, 20:58
Кажется, я рано порадовалась. Это оно откомпелировалось без ошибки, а вот когда я решила все это запустить, т.е. на кнопочку кликнуть в меню, получилось вот что:
Exception occurred during event dispatching:
java.lang.NullPointerException
at Tp2.actionPerformed(Tp2.java:191)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:14
45)
at javax.swing.AbstractButton$ForwardActionEvents.actionPerformed(Abstra
ctButton.java:1499)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel
.java:373)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:245
)
at javax.swing.AbstractButton.doClick(AbstractButton.java:274)
at javax.swing.plaf.basic.BasicMenuItemUI$MouseInputHandler.mouseRelease
d(BasicMenuItemUI.java:882)
at java.awt.Component.processMouseEvent(Component.java:3710)
at java.awt.Component.processEvent(Component.java:3539)
at java.awt.Container.processEvent(Container.java:1159)
at java.awt.Component.dispatchEventImpl(Component.java:2588)
at java.awt.Container.dispatchEventImpl(Container.java:1208)
at java.awt.Component.dispatchEvent(Component.java:2492)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:2451
)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:2216)

at java.awt.LightweightDispatcher.dispatchEvent(Container.java:2125)
at java.awt.Container.dispatchEventImpl(Container.java:1195)
at java.awt.Window.dispatchEventImpl(Window.java:923)
at java.awt.Component.dispatchEvent(Component.java:2492)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:334)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchTh
read.java:126)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre
ad.java:93)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:88)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:80)
Что это все значит, и откуда может взяться NullPointerException, если я его уже отловила в самой функции?

Автор: Domestic Cat 11.11.2004, 21:11
А что в строкe 191?

Автор: Elene 11.11.2004, 21:15
Как раз bdDonnees.lireBddsFabr(nomFichier);
Добавлено @ 21:16
На nomFichier я сделала вывод, он не пустой, а с названием файла, который надо считать.
Добавлено @ 21:22
Даже я сделала на прямую загрузку файла без FileDialog, т.е.
Код

bdDonnees.lireBddsFabr("cie.txt");

Все тот же NullPointerException. Не могу понять, как это может быть. Может быть у меня в самом методе что-то напутано?

Автор: Domestic Cat 11.11.2004, 21:24
Проверь, можet bdDonnees == null. Если неt, зaпостi код lireBddsFabr()

Автор: LSD 11.11.2004, 21:35
bdDonnees определенно null.

Автор: Elene 11.11.2004, 21:36
Да, действительно, так и было. Я ее обявила в мемберах, как private Bdd bdDonnees; , а в конструкторе написала: Bdd bdDonnees = new Bdd(); вместо bdDonnees = new Bdd(); Отсюда и NullPointerException. Огромное спасибо. Я сама бы никогда не догадалась, где "собака зарыта". Сейчас все отлично работает, можно сказать, благодаря Вам.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)