0

Я пытаюсь создать программу, которая считывает File, сохраняет содержимое (слова) в качестве ArrayList, сортирует ArrayList, а затем записывает содержимое отсортированногоArrayList обратно в File.Файла - FileNotFoundException

Я понятия не имею, почему он продолжает давать мне FileNotFoundException или NullPointerException (оба происходят, это немного странно) ...

Вот мой код, если кто-то может помочь, что было бы здорово.

Спасибо.

Кстати, код содержит четыре класса:

DriverClass, Вид (графический интерфейс пользователя), 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(); 
} 
} 
+1

Я не вижу разницы между указанными вами двумя входами. Кроме того, попробуйте выполнить косую черту ('/') вместо обратной косой черты. – user845279

+0

Обратные косые черты в Windows. И избежание обратных косых черт необходимо только для строковых литералов, пользователям в консоли (или большинстве типов ввода) не нужно их избегать. –

+0

Не могли бы вы уменьшить вопрос до точки в коде, где есть ошибка, а не давать всю программу? Stacktraces обычно указывают строку исключения. –

ответ

1

У вас есть несколько вопросов в коде. Вы расширяете представление, чтобы получить ссылку на поле textField '! и это не путь. Для выполнения этой простой задачи вы должны использовать обработку исключений. Также вы не можете читать и писать из/в файл одновременно! поэтому вам нужно отделить обязанности здесь. Когда вы закончите чтение файла, закройте его и откройте его снова с помощью любого писателя, который вы хотите использовать. Заключительное примечание. Вы можете использовать FileChooser для получения пути, что избавит вас от необходимости проверять правильные входные данные! Если вы хотите сделать трудный путь и заставить пользователя вводить путь вручную, вам нужно добавить escape-символ '/'. В вашем случае допустимый путь будет 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(); 
    } 

    . 
    . 
    . 
} 
+0

Большое спасибо. – corecase

+0

Добро пожаловать :) – Sultan

1

Есть пара выпуска в коде:

  • ReadFile и WriteFile расширяют View, согласно конструктору вы будете иметь несколько экземпляров JFrame открываемые, как вы делаете кадр видимым в конструкторе frame.setVisible(true);, ReadFile и WriteFile просто нужна ссылка в JTextField, который должен быть обновлено, просто передайте это как параметр.

  • Ваш sort определенно бросить IndexOutOfBoundsException для этой линии

    если ((words.get (внутренний)). CompareTo (words.get (внутренний + 1))> 0) {

    Эта линия не будет работать, когда он достигает последнего индекса, то почему бы не использовать простой Collections.sort(words);

  • у вас нет чека, если пользователь вошел путь или нет, если ничего не будет введено, вы получите NullPointerException в вашем ReadFile, в идеале если файл не найден, т. е. ваш сканер nul l, не продолжайте дальше. В настоящее время вы показываете сообщение об ошибке, но ваш код не останавливается на этом, он все еще пытается прочитать и отсортировать файл, который является неправильным.

1

Я пробовал ваш пример и отлаживал его. Я использовал файл c: \\ dir \\.текст как параметр в GUI, и файл читается правильно, поэтому в нем нет вашей проблемы. Исключение я получал от этого кода:

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); 
      } 
     } 
    } 
0

FileNotFoundException означает, что файл не найден.

NullPointerException означает, что вы пытались разыменовать нулевой указатель.

Если это не отвечает на ваш вопрос, я не знаю, что делает. StackOverflow не является службой отладки.

+0

Ты абсолютно прав; StackOverflow НЕ является отладочной службой - это служба, в которой люди помогают друг другу понять/решить проблемы. – corecase

Смежные вопросы