[英]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.