35

エラー:

filecontent.java:15: 報告されていない例外 java.io.IOException; キャッチするか、投げることを宣言する必要があります

ショーファイル(); ^ filecontent.java:78: 報告されていない例外 java.io.IOException; キャッチするか、投げることを宣言する必要があります

ショーファイル(); ^

すでに 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();
    }
}
4

5 に答える 5

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

メソッドshowfile()は をスローIOExceptionするため、それを使用するたびに、その例外をキャッチするか、再度スローする必要があります。何かのようなもの:

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

Java の例外について学ぶ必要があります。

于 2012-01-03T04:29:50.747 に答える
11

例外はスタックをバブルアップします。呼び出し元が IOException などのチェック済み例外をスローするメソッドを呼び出す場合、呼び出し元も例外をキャッチするか、それ自体をスローする必要があります。

最初のブロックの場合:

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

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

try catch ブロックを含める必要があります。

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);
            }
        });
    */
}

2番目の場合:

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() メソッドが例外をスローしていることに注意してください。それが、「throws」キーワードが、メソッドがその例外をスローする可能性があることを示していることです。showFile() メソッドがスローしている場合、そのメソッドを呼び出すすべてのコードが例外をキャッチする必要があります。許可されている場合は、同じ throws IOException 追加をメソッド シグネチャに含めることによって、例外を明示的にスローする必要があります。

メソッドがその例外をスローする可能性があることも宣言していないインターフェイスまたはスーパークラスで定義されたメソッド シグネチャをメソッドがオーバーライドしている場合、例外をスローするように宣言することはできません。

于 2012-01-03T04:35:27.263 に答える
8

このエラー メッセージは、呼び出すメソッドは、それが をスローshowfile()することを宣言するか、呼び出しが catch するブロック内にある必要があることを意味します。を呼び出すときは、これらのどちらも行いません。たとえば、コンストラクターはブロックを宣言も含んでもいません。IOExceptiontryIOExceptionshowfile()filecontentIOExceptiontry

その意図は、どこかのメソッドにブロックtry含め、この例外をキャッチして処理することです。コンパイラは、どこかで例外を処理するよう強制しようとしています。

ところで、このコードは (ぶっきらぼうで申し訳ありませんが)ひどいものです。開いているファイルを閉じず、BufferedReader常に最初のファイルを指し、別のファイルを指そうとしているように見えますが、ループにはさまざまな例外を引き起こすオフバイワンエラーが含まれています。これをコンパイルすると、期待どおりに動作しませ。少しゆっくりする必要があると思います。

于 2012-01-03T04:29:35.003 に答える
3

メソッド showFile() は、IOException をスローできることを宣言しています。これはチェックされた例外であるため、showFile() メソッドへの呼び出しは何らかの方法で例外を処理する必要があります。1 つのオプションは、showFile() の呼び出しを try-catch ブロックでラップすることです。

 try {
     showFile();
 }
 catch(IOException e) {
    // Code to handle an IOException here
 }
于 2012-01-03T04:29:54.063 に答える
0

呼び出し先が例外をスローした場合、つまりvoid showfile()がjava.io.IOExceptionをスローした場合、呼び出し元はそれを処理するか、再度スローする必要があります。

また、命名規則についても学びます。クラス名は大文字で始める必要があります。

于 2012-01-03T04:41:55.770 に答える