Запретить выход программы Java на NumberFormatException - PullRequest
0 голосов
/ 26 августа 2018

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

Мне нужна программа для чтения всех целых чисел, пропуска всего остального, продолжения чтения целых чисел, записи всех целых чисел в файл и вывода нецелых чисел в терминал.

Входной файлсодержит следующее:

2
1023
-56
84781
0
-9371
Rats
10
5

Программа запустится, если Rats удаляется из входного файла, но я не уверен, что все целые числа записываются в файл.Этот файл является двоичным файлом, и когда я запускаю 'od outputFileName.bin', он отображается на терминале:

0000000 000000 002400
0000004

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

input.nextLine();
output.println(line);

, то все целые числа будут записывать в выходной файл.

Вот мой код:

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

class DataTranslator {

    public static void main(String[] args) {
        Scanner input = null;
        Scanner user = null;

        PrintWriter output = null;

        String inputFileName;
        String outputFileName;

        try {
            // Create a Scanner for user input
            user = new Scanner(System.in);

            // Prepare the input file
            System.out.print("Input File --> ");
            inputFileName = user.nextLine().trim();
            File file = new File(inputFileName);
            input = new Scanner(file);

            // Prepare the output file
            System.out.print("Output File --> ");
            outputFileName = user.nextLine().trim();
            output = new PrintWriter(outputFileName);
        } catch (IOException e) {
            System.out.println("Problem opening file.");
            System.out.println(e.getMessage());
            if (input != null)
                input.close();
            if (output != null)
                output.close();
            if (user != null)
                user.close();
            return;
        }

        // processing loop
        try {
            // for each line of input
            while (input.hasNextLine()) {
                int line = Integer.parseInt(input.nextLine().trim()); 
                // input.nextLine();
                // output.println(line);
                DataOutputStream dataOut = new DataOutputStream(
                        new BufferedOutputStream(new FileOutputStream(outputFileName)));
                dataOut.writeInt(line);
                System.out.println(line);
                dataOut.close();
            }
        } catch (IOException e) {
            System.out.println("File I/O Error");
            System.err.println(e.getMessage());
        } catch (NumberFormatException e) {
            System.out.print("Poor input data ");
            System.err.println(e.getMessage() + ", this will not work");
            // e.printStackTrace();
        } finally {
            // close the files
            if (input != null)
                input.close();
            if (output != null)
                output.close();
            if (user != null)
                user.close();
        }
    }
}

Спасибо за любую помощь.

Тони

Ответы [ 4 ]

0 голосов
/ 26 августа 2018

этот код читает файл и пишет только цифры.

public static void main(String[] args) throws IOException {

        BufferedReader inputStream = null;
        BufferedWriter outputStream = null;

        try {
            inputStream = new BufferedReader(new FileReader("entryFile.txt"));
            outputStream = new BufferedWriter(new FileWriter("outputline.txt"));
            String line;
            while ((line = inputStream.readLine()) != null) {
                boolean add = false;
                for (int j = (line.length()-1); j >= 0; j--) {
                    if (Character.isDigit(line.charAt(j)) || (j==0 && Character.toString(line.charAt(j)).equals("-"))) {
                      add = true;
                    } else {
                      add = false;
                      break;
                    }
                }
                if(add){
                   outputStream.write(line + "\n");
                } else {
                   System.out.println("this is not number: "+line);
                }  
            }
        } finally {
            if (inputStream != null) {
                inputStream.close();
            }
            if (outputStream != null) {
                outputStream.close();
            }
        }
    }

entryFile.txt

2
1023
-56
84781
0
-9371
-2452-723878-
Rats
10
5

outputline.txt

2
1023
-56
84781
0
-9371
10
5

Консольный вывод:

run:
this is not number: -2452-723878-
this is not number: Rats
BUILD SUCCESSFUL (total time: 0 seconds)
0 голосов
/ 26 августа 2018

этот код напечатает вам все числа и пропустит любые нечисловые значения

Files.readAllLines(Paths.get("yourFileNameAndPath.txt")).stream()
                .filter(s -> !s.isEmpty())
                .filter(s -> s.matches("-?[0-9]+"))
                .map(String::trim)
                .collect(Collectors.toList()).forEach(System.out::println); 

Но вы должны использовать Java 8 для этого, я использую регулярные выражения для таких вещей, используйте NumberFormatException (если это не нужно) это плохой подход.

0 голосов
/ 26 августа 2018

Этот код будет работать, учитывая, что если вы встретите String вместо Integer, цикл просто проигнорирует его и продолжит обработку следующей строки.Просто поймайте исключение в while и выполните continue, чтобы перейти к следующей строке, если есть String.

while (input.hasNextLine()) {
     try {
         int line = Integer.parseInt(input.nextLine().trim());
         DataOutputStream dataOut = new DataOutputStream(
         new BufferedOutputStream(new FileOutputStream(outputFileName)));
         dataOut.writeInt(line);
         System.out.println(line);
         dataOut.close();
         }catch(NumberFormatException ne){
            continue;
         }
 }
0 голосов
/ 26 августа 2018

Вам нужно перехватить это исключение при чтении входного файла.Просто добавьте условие catch в ваш блок try-catch.Так что ваше приложение не сломается при исключении числового формата.

try {
    // Create a Scanner for user input
    user = new Scanner(System.in);
    // Prepare the input file
    System.out.print("Input File --> ");
    inputFileName = user.nextLine().trim();
    File file = new File(inputFileName);
    input = new Scanner(file);

    // Prepare the output file
    System.out.print("Output File --> ");
    outputFileName = user.nextLine().trim();
    output = new PrintWriter(outputFileName);
} catch (NumberFormatException ex) {
    // ignore exception or whatever you want
} catch (IOException e) {
    System.out.println("Problem opening file.");
    System.out.println(e.getMessage());
    if (input != null)
        input.close();
    if (output != null)
        output.close();
    if (user != null)
        user.close();
    return;
}
...