0

Fileを読み取り、コンテンツ (単語) を に保存し、ArrayListを並べ替え、並べ替えArrayListた内容を に書き戻すプログラムを作成しようとしています。 ArrayListFile

理由はわかりませんが、それは私にaFileNotFoundExceptionまたはaを与え続けますNullPointerException(両方が発生しています、それは少し奇妙です)...

これが私のコードです。誰かがそれを助けることができれば、それは素晴らしいことです。

ありがとう。

ちなみに、コードには 4 つのクラスが含まれています。

DriverClass、View (GUI)、ReadFile、および WriteFile。

コメントは無視してかまいません。私は自分用に書いただけです。「field.getText();」の場合 C:\Users\Corecase\Desktop\test.txt ユーザーが入力してみましたがC:\\Users\\Corecase\\Desktop\\test.txt)、それも機能しないとし ましょ う。

再度、感謝します!

public class DriverClass 
{
    public static void main(String[] args)
    {
        View open= new View();
    }
}

//意見

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

public class View implements ActionListener
{
private JFrame frame = new JFrame("File Sorter");
private JPanel mainPane = new JPanel();
private JPanel textPane = new JPanel();
private JPanel buttonPane = new JPanel();
private JButton sortButton = new JButton("Sort");
private JLabel label = new JLabel("Enter file path: ");
public JTextField field = new JTextField(25);

private Font f = new Font("Trebuchet MS", Font.PLAIN, 20);


public View()
{
    frame.setSize(500,500);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.add(mainPane);

    mainPane.setLayout(new GridLayout(2,1));
    mainPane.setBackground(Color.gray);

    mainPane.add(textPane);
    mainPane.add(buttonPane);

    textPane.setLayout(new GridLayout(2,1));
    textPane.add(label);
    textPane.add(field);
    buttonPane.add(sortButton);
    field.setFont(f);
    sortButton.setFont(f);
    label.setFont(f);

    sortButton.addActionListener(this);
}
public void actionPerformed(ActionEvent e)
{
    if(e.getSource() == sortButton)
    {
        ReadFile r = new ReadFile(field.getText());
        WriteFile w = new WriteFile(field.getText());

        r.openFile();
        r.readAndSortFile();
        r.closeFile();

        w.openFile();
        w.writeFile(r.getList());
        w.closeFile();
    }
}
}

//ReadFile

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

public class ReadFile extends View
{
private ArrayList<String> words = new ArrayList<String>();
private String fileName = new String();
private Scanner x;

public ReadFile(String address)
{
    fileName = address;
}
public void openFile()
{
    try
    {
        x = new Scanner(new File(fileName));
    }
    catch(Exception e)
    {
        field.setText("Could not read file.");
    }
}

public void readAndSortFile()
{
    while(x.hasNext())
        words.add(x.next());

    sort();
}

public void closeFile()
{
    x.close();
}

public ArrayList<String> sort()
{
    String temp = "";

    for(int index = 0; index < words.size(); index++)
    {
        for(int inner = 0; inner < words.size(); inner++)
        {
            if((words.get(inner)).compareTo(words.get(inner+1)) > 0)
            {
                temp = words.get(inner);
                words.set(inner, words.get(inner + 1));
                words.set(inner + 1, temp);
            }
        }
    }
    return words;
}

public ArrayList<String> getList()
{
    return words;
}
}

//WriteFile

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

public class WriteFile extends View
{
private Formatter x;
private String fileName = new String();

public WriteFile(String address)
{
    fileName = address;
}

public void openFile()
{
    try
    {
        x = new Formatter(fileName);
    }
    catch(Exception e)
    {
        field.setText("Could not write to file.");
    }
}

public void writeFile(ArrayList<String> myWords)
{
    for(int index = 0; index < myWords.size(); index++)
        x.format("%s", myWords.get(index), "\n");//%s means string - in this case ONE string
}

public void closeFile()
{
    x.close();
}
}
4

4 に答える 4

1

コードにいくつかの問題があります。TextField 'field' の参照を取得するために View を拡張しています! それは行くべき道ではありません。この単純なタスクを実行するには、例外処理を使用する必要があります。また、ファイルの読み取りと書き込みを同時に行うことはできません。したがって、ここで職務を分離する必要があります。ファイルの読み取りが終了したら、ファイルを閉じて、使用するライターで再度開きます。最後の注意: FileChooser を使用してパスを取得できます。これにより、有効な入力をチェックする必要がなくなります。難しい方法でユーザーに手動でパスを入力させたい場合は、エスケープ文字「/」を追加する必要があります。この場合、有効なパスは次のようになります。 C:\\Users\\Corecase\\Desktop\\test.txt

Change the following code in 'View.java'

    if (e.getSource() == sortButton)
    {
        ReadFile r;
        try
        {
            r = new ReadFile(field.getText());
            r.readAndSortFile();

            WriteFile w = new WriteFile(field.getText());
            w.writeFile(r.getList());

        } 
        catch (FileNotFoundException e1)
        {
            field.setText(e1.getMessage());
            e1.printStackTrace();
        }       
    }

and change 'WriteFile.java' to

public class WriteFile
{
    private Formatter x;
    private String fileName;

    public WriteFile(String address) throws FileNotFoundException
    {
        fileName = address;
        try
        {
            x = new Formatter(fileName);
        } catch (Exception e)
        {
            throw new FileNotFoundException("Could not write to file.");
        }
    }

    public void writeFile(ArrayList<String> myWords)
    {
        for (int index = 0; index < myWords.size(); index++)
            x.format("%s%s", myWords.get(index), System.lineSeparator());

        // now you are done writing so close the file.

        x.close();
    }
}

Change 'ReadFile.java' to

public class ReadFile
{
    private ArrayList<String> words;
    private String fileName;
    private Scanner x;

    public ReadFile(String path) throws FileNotFoundException
    {
        fileName = path;
        words = new ArrayList<String>();
        try
        {
            x = new Scanner(new File(fileName));
        } catch (Exception e)
        {
            throw new FileNotFoundException("File Doesn't exist in the place you specified.");
        }
    }


    public void readAndSortFile()
    {
        while (x.hasNext())
            words.add(x.next());
        Collections.sort(words);

        // Now you are done reading and sorting, so close the file.
        x.close();
    }

    .
    .
    .
}
于 2012-06-13T10:18:48.360 に答える
1

私はあなたの例を試してデバッグしました。GUI のパラメータとして c:\\dir\\file.text を使用しましたが、ファイルは適切に読み取られているため、問題はありません。私が得ていた例外は、このコードから来ていました:

    for (int index = 0; index < words.size(); index++) {
        for (int inner = 0; inner < words.size(); inner++) {
            if ((words.get(inner)).compareTo(words.get(inner + 1)) > 0) {
                temp = words.get(inner);
                words.set(inner, words.get(inner + 1));
                words.set(inner + 1, temp);
            }
        }
    }
于 2012-06-13T06:56:24.167 に答える
1

あなたのコードにはいくつかの問題があります:

  • ReadFileコンストラクターでフレームを表示するようにしているため、コンストラクターごとに複数のインスタンスが開かれ、更新WriteFileする必要がViewあるの参照が必要なため、これをパラメーターとして渡すだけです。JFrameframe.setVisible(true);ReadFileWriteFileJTextField

  • あなたsortは間違いなくIndexOutOfBoundsExceptionこのラインを投げます

    if ((words.get(inner)).compareTo(words.get(inner + 1)) > 0) {

    この行は、最後のインデックスに到達すると機能しません。simple を使用しないのはなぜですかCollections.sort(words);

  • ユーザーがパスを入力したかどうかのチェックはありません。何も入力さNullPointerExceptionれてReadFileいない場合は、理想的にはファイルが見つからない場合、つまりスキャナーがnullの場合は、先に進まないでください。現在、エラー メッセージが表示されていますが、コードはそこで停止せず、間違ったファイルを読み取って並べ替えようとします。

于 2012-06-13T06:46:59.833 に答える
0

FileNotFoundExceptionファイルが見つからなかったことを意味します。

NullPointerExceptionnull ポインターを逆参照しようとしたことを意味します。

それがあなたの質問に答えない場合、私は何をするのかわかりません。StackOverflow はデバッグ サービスではありません。

于 2012-06-13T10:42:55.537 に答える