Сообщение об ошибке "незарегистрированное исключение java.io.IOException; должно быть обнаружено или объявлено брошенным"

Ошибка:

filecontent.java:15: незарегистрированное исключение java.io.IOException; должны быть пойманы или объявлены брошенными

showfile(); ^ filecontent.java:78: незарегистрированное исключение java.io.IOException; должны быть пойманы или объявлены брошенными

showfile(); ^

Я уже выбрал java.io.IOException, но все же он показывает эти ошибки.

Мой код:

import java.awt.*;
import java.awt.event.*;
import java.io.*;

class filecontent extends Frame implements ActionListener
{
    TextField t[] = new TextField[4];
    TextArea ta[] = new TextArea[4];
    Button submit;
    Panel p1;
    filecontent()
    {
        setGUI();
        setRegister();
        showfile();
        setTitle("FileData");
        setVisible(true);
        setSize(300, 300);
        /*  addWindowListener(new WindowAdapter()
            { 
                public void windowClosing(WindowEvent we)
                { 
                    System.exit(0); 
                }
            }); 
        */

    }

    void setGUI()
    {
        p1 = new Panel();
        p1.setLayout(new GridLayout(5, 4, 10, 10));
        for(int i=0; i<4; i++)
        {
            t[i] = new TextField(10);
            ta[i] = new TextArea("");
            p1.add(t[i]);
            p1.add(ta[i]);
        }
        submit = new Button("Submit");
        p1.add(submit);
    }

    void setRegister()
    {
        submit.addActionListener(this);
    }

    void showfile() throws java.io.IOException
    {
        FileReader fin[] = new FileReader[4];
        FileReader fn;
        //   br[]=new BufferedReader[4];

        for(int i=0;i<4;i++)
        {
            fin[i]=new FileReader(t[i].getText());
        }
        int cnt = 1;
        String s;
        fn = fin[0];
        BufferedReader br = new BufferedReader(fn);
        while(cnt <= 4)
        {
            if((s=br.readLine()) != null)
            {
                ta[cnt-1].append(s+"");
            }
            else
            {
                cnt++;
                fn = fin[cnt-1];
                ta[cnt-1].setText("");
            }
        }
    }

    public void actionPerformed(ActionEvent ae)
    {
        if(ae.getSource()==submit)
        {
            showfile();
        }
    }

    public static void main(String ar[])
    {
        new filecontent();
    }
}

Ответ 1

void showfile() throws java.io.IOException  <-----

Ваш showfile() выдает IOException, поэтому всякий раз, когда вы его используете, вы должны либо поймать это исключение, либо снова его перегрузить. Что-то вроде:

try {
  showfile();
}
catch(IOException e) {
  e.printStackTrace();
}

Вы должны узнать об исключениях на Java.

Ответ 2

Сообщение об ошибке означает, что любой метод, вызывающий showfile() должен либо объявить, что он, в свою очередь, вызывает IOException, либо вызов должен быть внутри блока try который ловит IOException. Когда вы вызываете showfile(), вы ничего не делаете; например, ваш конструктор filecontent не объявляет IOException не содержит блок try.

Цель состоит в том, что какой-то метод где-то должен содержать блок try, а также улавливать и обрабатывать это исключение. Компилятор пытается заставить вас обработать исключение где-нибудь.

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

Ответ 3

Исключения пузырят стек. Если вызывающий вызов вызывает метод, который выдает исключенное исключение, например IOException, он должен также либо поймать исключение, либо сам его выбросить.

В случае первого блока:

filecontent()
{
    setGUI();
    setRegister();
    showfile();
    setTitle("FileData");
    setVisible(true);
    setSize(300, 300);

    /*
        addWindowListener(new WindowAdapter()
        {
            public void windowClosing(WindowEvent we)
            {
                System.exit(0);
            }
        });
    */
}

Вам нужно будет включить блок catch try:

filecontent()
{
    setGUI();
    setRegister();
    try {
        showfile();
    }
    catch (IOException e) {
        // Do something here
    }
    setTitle("FileData");
    setVisible(true);
    setSize(300, 300);

    /*
        addWindowListener(new WindowAdapter()
        {
            public void windowClosing(WindowEvent we)
            {
                System.exit(0);
            }
        });
    */
}

В случае второго:

public void actionPerformed(ActionEvent ae)
{
    if (ae.getSource() == submit)
    {
        showfile();
    }
}

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

public void actionPerformed(ActionEvent ae)
{
    if(ae.getSource()==submit)
    {
        try {
            showfile();
        }
        catch (IOException e) {
            // Do something here
        }
    }
}

Помните, что метод showFile() выбрасывает исключение; что ключевое слово "бросает" указывает, что метод может выдать это исключение. Если метод showFile() метает, то какой бы код не вызывал этот метод, или он явно выдает исключение, включив в него то же самое, что и добавление IOException к сигнатуре метода, если это разрешено.

Если метод переопределяет сигнатуру метода, определенную в интерфейсе или суперклассе, который также не объявляет, что метод может выкинуть это исключение, вы не можете объявить его для исключения.

Ответ 4

Ваш метод showFile() объявляет, что он может генерировать исключение IOException. Поскольку это проверенное исключение, любой вызов метода showFile() должен каким-то образом обработать исключение. Один из вариантов - обернуть вызов showFile() в блок try-catch.

 try {
     showFile();
 }
 catch(IOException e) {
    // Code to handle an IOException here
 }

Ответ 5

Когда вызываемый вызывает исключение, т. Е. Void showfile() выдает java.io.IOException, вызывающий должен обработать его или выбросить снова.

А также изучите соглашения об именах. Название класса должно начинаться с заглавной буквы.