2015-03-20 2 views
-1

В моем задании мне нужно работать с выводом списка имен в действительный выходной файл или файл ошибки. То, что мне нужно сделать прямо сейчас, - это сканировать текстовый файл для любых входных ошибок (например, то, что должно быть int имеет букву в нем, поэтому выдает исключение).Как распечатать всю строку строки для вывода файла (java)?

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

Вот моя программа ...

import java.io.*; 
import java.util.*; 
public class TaxDeductionDriver { 

public static void main(String[] args) { 

    //array will be used to store information and output net income 
    Employee[] info = new Employee[71];    
    Scanner input = null; 
    PrintWriter output = null; 
    int i = 0; 


    try { 
     input = new Scanner(new FileInputStream("payroll.txt")); 
     output = new PrintWriter(new FileOutputStream("error.txt")); 

      while(input.hasNextLine()) { 

       try { 

        //assigns a column to each variable 
        int empNum = input.nextInt();      
        String fName = input.next(); 
        String lName = input.next(); 
        double avgHrs = input.nextDouble(); 
        double hrWage = input.nextDouble(); 

        //checks to see if wage is below minimum ($10.35) 
        if(hrWage < 10.35) {         
         throw new InputMismatchException(); 
        } 

        //object used to output list of valid information and calculate tax deductions 
        //if one of parameters is null, input mismatch exception is thrown 
        info[i] = new Employee(empNum, fName, lName, avgHrs, hrWage);   

        i++; 

        } 
        catch (InputMismatchException e) { 
         //outputs invalid information to error file 
         output.println(input.nextLine());  
         continue; 
        } 
      } 
      output.close(); 
    } 
    catch (FileNotFoundException e) { 
     System.out.println("Couldn't find file"); 
    } 
    finally { 
     System.exit(0); 
    } 
} 
} 

мой файл ошибок должен быть, как этот

> >Error lines found in file payroll 
16783 JOHN CONNAUGHT 30.5 10.00 
21O15 JAMES HAROLD 32.0 10.50 
52726 MITCHELL HACKETT 23,7 12.05 
#9331 MARIO TODARO 35.0 17.00 
22310 CLAUDIA O’HARE 30.5 9.80 
26734 EDITH ROOSEVELT 20.O 25.50 
41024 EMILE BOURGEOYS 8.5 6.45 
43018 JAMES WALKER 20.0 8.00 
00812 VICTORIA PORTER 36.0 9.50 
9201(DAVID BROCK 29.0 22.50 

Но когда я запускаю программу, она заканчивается, как это

*john connaught is missing here* 
21O15 JAMES HAROLD 32.0 10.50 
23,7 12.05 
#9331 MARIO TODARO 35.0 17.00 

20.O 25.50 



9201(DAVID BROCK 29.0 22.50 

У меня есть идея, что происходит, но как заставить PrintWriter выводить всю строку, а не ее часть?

ответ

2

Сканер продвинет каждый раз, когда вы вызываете "следующий" метод, так что в вашем поймать блок input.nextLine() будет вернуть оставшуюся часть строки от последнего «следующего» вызова до следующего символа строки.
Чтобы исправить это, сначала нужно прочитать всю строку, проанализировать ее и в случае ошибки вывести ее. Что-то вроде этого:

String line = input.nextLine(); 
    try { 
     String[] tokens = line.split("\\s+"); 
     int empNum = Integer.parseInt(tokens[0]); 
     String fName = tokens[1]; 
     String lName = tokens[2]; 
     double avgHrs = Double.parseDouble(tokens[3]); 
     double hrWage = Double.parseDouble(tokens[4]); 
     //....... 
    } 
    catch (InputMismatchException e) { 
     output.println(line);  //outputs invalid information to error file 
    } 
+0

Или, как @Naz, вы можете восстановить строку ввода из фрагментов, которые вы разобрали. – Richard

+0

Я пробовал, кажется, лучше метод, но как только empNum = 21O15, он отправляет меня в блок finally – Dude420

+0

Это нормально, я исправил его, спасибо за вашу помощь! Все, что мне нужно было сделать, это инициализировать мои переменные (empNum, fName и т. д.) за пределами цикл и назначить им начальные значения. Теперь все, что правильно выводит – Dude420

1

Попробуйте изменить эту строку:

output.println(input.nextLine()); 

к:

output.println(empNum +" fname" +" lname"+ avghrs + ""+ hrswage); 
+0

Да, я пытался, но затмение дает мне ошибку – Dude420

+0

какой тип ошибки? – Naz

+0

«empNum не может быть разрешен переменной» – Dude420

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