簡體   English   中英

從文本文件提取的數據將其存儲在變量中時出錯

[英]data extracted from text file gives error when storing it in variables

因此,我正在使用Scanner對象從包含公司員工(其ID,姓名和經理ID)組成的文本文件中讀取數據。我InputMismatchException的問題是我存儲在這些文件中的數據提供了InputMismatchException

這是代碼:

public class DataExtracter {
private Scanner x;
private String fileName = "C:\\Users\\Jesal\\Documents\\Waqar's thing\\BT Technology Graduate Programme 2015 - Software coding exercise/atchm_3803.txt".replaceAll("[|]", "");
private File f;

private int lineCounter;
private String employeeIdLst[];
private String employeeNameLst[];
private String managerIdLst[];

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    DataExtracter bt = new DataExtracter();
    de.openFile();
    de.readFile();
    de.closeFile();
}

public DataExtracter() {        
    f =new File(fileName);
    lineCounter = 0;
    lineCounter();
    employeeIdLst = new String[lineCounter];
    employeeNameLst = new String[lineCounter];
    managerIdLst = new String[lineCounter];
}

public void openFile() {
    try {
        x = new Scanner(f);
    } catch (Exception e) {
        System.out.println("could not find file");
    }
}

public void readFile() {
    x.nextLine();

    int index = 0;
    while (x.hasNext() && index < lineCounter) {           
        String theFile = x.next().replaceAll("[|]", " ");

        int employeeId = x.nextInt();
        String empName = x.next();
        int managerId = x.nextInt();

        System.out.print(theFile); 
    }

    index++;
}

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

public int lineCounter() {    
    openFile();

    x.nextLine();

    while(x.hasNext() && !x.nextLine().isEmpty()){
        lineCounter++;       
    }

    closeFile();

   // System.out.println(lineCounter);
    return lineCounter;
}

}

當我運行程序時沒有以下代碼行:

int employeeId = x.nextInt();
String empName = x.next();
int managerId = x.nextInt();

將以下內容打印到控制台:

1 Dangermouse   2 GonzotheGreat 1  3 InvisibleWoman 1  6 BlackWidow 2  12 HitGirl 3  15 SuperTed 3  16 Batman 6  17 Catwoman 6 BUILD SUCCESSFUL (total time: 0 seconds)

這是堆棧跟蹤:

Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Scanner.java:909)
at java.util.Scanner.next(Scanner.java:1530)
at java.util.Scanner.nextInt(Scanner.java:2160)
at java.util.Scanner.nextInt(Scanner.java:2119)
at binarytree.BinaryTree.readFile(BinaryTree.java:76)
at binarytree.BinaryTree.main(BinaryTree.java:41)

Java結果:1

這是文本文件的數據:

  | Employee ID | Name            | Manager ID | 
  | 1           | Dangermouse     |            |
  | 2           | Gonzo the Great | 1          |
  | 3           | Invisible Woman | 1          |
  | 6           | Black Widow     | 2          |
  | 12          | Hit Girl        | 3          |
  | 15          | Super Ted       | 3          |
  | 16          | Batman          | 6          |
  | 17          | Catwoman        | 6          |

我無法理解如何無法檢索nextInt()和字符串,因為所檢索的數據類型的順序在整個過程中都是相同的,並且如果我正確的話,在讀取輸入時會丟棄空格。 我還要稍后使用提取的數據將每個列數據存儲在數組中或僅存儲在ArrayList中。

它給您帶來麻煩的原因是,當用戶輸入整數然后點擊Enter時,

剛剛輸入了兩個內容->>整數和\\ n的“換行符”。

您正在調用的方法nextInt()僅讀取整數,這會將換行符留在輸入流中。 但是調用nextLine()確實會讀取換行符,這就是為什么在代碼正常工作之前必須調用nextLine()的原因。 您可能還調用了next() ,該名稱也已在換行符中閱讀。

public class DataExtractor {

     //.....
     while (x.hasNext() && index < lineCounter) {        
         String theFile = x.next().replaceAll("[|]", " ");

         int employeeId = x.nextInt();
         x.nextLine();  // Added Here to read next value
         String empName = x.next();
         x.nextLine();   // Added Here to read next value
         int managerId = x.nextInt();

         System.out.print(theFile);
     }
     //.....    
}

鑒於:

| 1           | Dangermouse     |            |

和您的代碼:

String theFile = x.next().replaceAll("[|]", " ");
int employeeId = x.nextInt();
String empName = x.next();
int managerId = x.nextInt();

System.out.print(theFile); 

您是否認為theFile將用空格替換所有| s? 它僅替換第一個|。 對employeeId的調用是可以的,對empName的調用將獲取下一個令牌,即另一個|。 下一個標記是Dangermouse,但您嘗試將其解析為一個int,因此會出錯。

以下應該為您工作:

int employeeId = x.nextInt();
x.next(); // skip |
StringBuilder buf = new StringBuilder(x.next());
String nextToken = x.next();
while (nextToken.indexOf('|') < 0) {
    buf.append(" " + nextToken);
    nextToken = x.next();
}
String empName = buf.toString();
int managerId = 0;
String managerIdString = x.next();
if (managerIdString.indexOf('|') < 0) {
    managerId = Integer.parseInt(managerIdString);
    x.next(); // Skip the last |
}

您的數據不一致。 您缺少“ |” 因此,當您嘗試轉換“ |”時,您有此例外 詮釋。 我建議第一種構建方法來檢查您的文件,然后再解析。

文件中的位置(例如Dangermouse)沒有managerID可能會使您失望。 嘗試捕獲塊可能會讓程序跳過這些塊。

try
{
    int employeeId = x.nextInt();
    String empName = x.next();
    int managerId = x.nextInt();
}
catch (Exception e)
{
    x.nextLine();
    System.out.print(String.ValueOf(index));
}

如果唯一的問題是人們沒有經理,那么這可能會更好。

int employeeId = x.nextInt();
String empName = x.next();
try
{
    int managerId = x.nextInt();
}

catch(Exception e)
{
    int managerId = -1;  //junk value to let you know this person doesn't have a managerId
}

另外,您可能需要考慮將Id從int更改為string。 這確實可以幫助克服解析錯誤,並且不會造成太大的負面影響。 也就是說,您可能不打算將一個managerId除以另一個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM