2015-04-07 107 views
1

我有file.txt的:InputMismatchException时在阅读文件,扫描仪

7 10 5 
ADD_FLIGHT SV221 Jeddah NewYork 30 7000 
ADD_FLIGHT SV223 Jeddah London 30 4000 
ADD_FLIGHT SV225 Jeddah Paris 30 3500 
ADD_FLIGHT SV227 Jeddah Cairo 30 2000 
ADD_PASS Mohammed Ali 33 M 0555788778 
ADD_PASS Sara Maghrabi 30 F 0555111111 
ADD_PASS Hani Ali 20 M 0555223344 
ADD_PASS Mohammed Hafeth 33 M 0555889876 
ADD_PASS Ahmad Sami 44 M 0555768768 
ADD_FLIGHT SV332 Jeddah Riyadh 20 500 
ADD_FLIGHT SV334 Jeddah Dammam 20 600 
ADD_FLIGHT SV367 Jeddah Dubai 25 2000 
ADD_PASS Salwa Ali 33 F 0555765672 
ADD_PASS Faisal Amri 20 M 0555111111 
ADD_PASS Mona Saleem 33 F 0555222112 
ADD_PASS Ali Ali 33 M 0555743344 
ADD_PASS Marwa Ahmad 33 F 0555545855 

我想从文件中读取信息飞行,并把信息对象的数组,如果该文件包含ADD_flight声明..另外,如果文件包含ADD_PASD语句,则乘客从文件中读取信息乘客并将信息放入一个对象数组中。

我不知道为什么我有错误赎罪在我的代码:

File fin = new File("input.txt"); 
Scanner input = new Scanner(fin); 

int c=0; 
while (input.hasNextLine()){ 
    String s=input.nextLine(); 
    if (input.hasNext("ADD_FLIGHT")){ 
     inputFlight (input, flight ,fin); 
    } 
    else if (input.hasNext("ADD_PASS")){ 
     inputPass(input, passenger,fin); 
      listFlightDetails(flight); 
      listPassengerDetails(passenger); 
    }}}//end the mine 


public static void inputFlight (Scanner input, Flight[] flight ,File fin) throws IOException{ 
if (indexFlight<flight.length) { 
    flight[indexFlight]=new Flight(); 
    String flightCode=input.next(); 
    flight[indexFlight].setflightCod(flightCode); 
     String ctyfrom=input.next(); 
    flight[indexFlight].setcityFrom(ctyfrom); 
     String ctyto=input.next(); 
    flight[indexFlight].setCityTo(ctyto); 
      int total=input.nextInt(); 
        flight[indexFlight].setTotalSeats(total); 
      double price=input.nextDouble(); 
        flight[indexFlight].setprice(total); 

indexFlight++; 

}} 
    public static void inputPass(Scanner input, Passenger[] passenger ,File fin) throws IOException{ 
if (indexPassenger<passenger.length) { 
    passenger[indexPassenger]=new Passenger(); 
    String name=input.next(); 
    passenger[indexPassenger].setname(name); 
     int age=input.nextInt(); 
    passenger[indexPassenger].setage(age); 
     char gender=input.nextLine().charAt(0); 
    passenger[indexPassenger].setgender(gender); 
      String d=input.next(); 
        passenger[indexPassenger].setphone(d); 

indexPassenger++; 

}} 
     public static void listFlightDetails(Flight[] flight) { 
     for (int i = 0; i < indexFlight; i++) { 
      if (flight[i].getflightCod() != null) { 
       System.out.println("Enter " + i + " for Flight code :" + flight[i].getflightCod() + " , " + flight[i].getcityFrom() + " , " + flight[i].getCityTo()); 


}}} 
public static void listPassengerDetails(Passenger[] passenger) { 
     for (int i = 0; i < indexPassenger; i++) { 
      if (passenger[i].getname() != null) { 
       System.out.println("Enter " + i + " for Passenger :" + passenger[i].getname() + " , " + passenger[i].getgender()); 
      } 

} 

} 

我怎样才能正确的代码? 这个错误,它自带

Exception in thread "main" java.util.InputMismatchException 
    at java.util.Scanner.throwFor(Scanner.java:864) 
    at java.util.Scanner.next(Scanner.java:1485) 
    at java.util.Scanner.nextInt(Scanner.java:2117) 
    at java.util.Scanner.nextInt(Scanner.java:2076) 
    at FlightSystem.FlightSystem.inputFlight(FlightSystem.java:65) 
    at FlightSystem.FlightSystem.main(FlightSystem.java:34) 
Java Result: 1 
BUILD SUCCESSFUL (total time: 1 second) 
This error for pass 

    Enter 0 for Flight code :SV223 , Jeddah , London 
     Enter 0 for Flight code :SV223 , Jeddah , London 
     Enter 0 for Flight code :SV223 , Jeddah , London 
     Enter 1 for Flight code :SV227 , Jeddah , Cairo 
     Enter 0 for Flight code :SV223 , Jeddah , London 
     Enter 1 for Flight code :SV227 , Jeddah , Cairo 
     Exception in thread "main" java.util.InputMismatchException 
      at java.util.Scanner.throwFor(Scanner.java:864) 
      at java.util.Scanner.next(Scanner.java:1485) 
      at java.util.Scanner.nextInt(Scanner.java:2117) 
      at java.util.Scanner.nextInt(Scanner.java:2076) 
      at FlightSystem.FlightSystem.main(FlightSystem.java:39) 
     Java Result: 1 
+0

难道你的意思是,如果符合“ADD_FLIGHT”开始要插入飞行阵列的详细信息,如果它以“ADD_PASS”开始,你想将其存储在乘客阵列? – Kartic

+0

是的:)我的意思是 – user4746449

+0

你得到了什么错误? –

回答

0

您的代码

if (input.hasNext("ADD_FLIGHT")){ 
     inputFlight (input, flight ,fin); 
    } 

指向此行文件ADD_FLIGHT SV221吉达纽约30 7000的。

现在在您的inputFlight(...)方法中,仔细阅读以下代码的注释。我解释了你为什么得到InputMisMatchException。

public static void inputFlight (Scanner input, Flight[] flight ,File fin) throws IOException{ 
if (indexFlight<flight.length) { 
    flight[indexFlight]=new Flight(); 
    String flightCode=input.next();// This line takes ADD_FLIGHT instead of flight code SV221 
    flight[indexFlight].setflightCod(flightCode); 
     String ctyfrom=input.next();//This line takes SV221 instead of Jeddah 
    flight[indexFlight].setcityFrom(ctyfrom); 
     String ctyto=input.next();//This line takes Jeddah instead of NewYork 
    flight[indexFlight].setCityTo(ctyto); 
      int total=input.nextInt();//This line takes NewYork instead of 30 thus InputMisMatchException occurs. 
        flight[indexFlight].setTotalSeats(total); 
      double price=input.nextDouble(); 
        flight[indexFlight].setprice(total); 

indexFlight++; 

}} 

** INT总= input.nextInt(); //这条线发生纽约而不是30从而InputMismatchException时发生。,因为您正在尝试获取Int,但输入从文件获取字符串。

为了避免例外,只需在读取其他字符串之前添加input.next();即可。这是代码。

public static void inputFlight (Scanner input, Flight[] flight ,File fin) throws IOException{ 
if (indexFlight<flight.length) { 
    String not_in_use=input.next()//**for moving input cursor to next (flight code)** 
    flight[indexFlight]=new Flight(); 
    String flightCode=input.next(); 
    flight[indexFlight].setflightCod(flightCode); 
     String ctyfrom=input.next(); 
    flight[indexFlight].setcityFrom(ctyfrom); 
     String ctyto=input.next(); 
    flight[indexFlight].setCityTo(ctyto); 
      int total=input.nextInt(); 
        flight[indexFlight].setTotalSeats(total); 
      double price=input.nextDouble(); 
        flight[indexFlight].setprice(total); 

indexFlight++; 

}} 

对于inputPass(...)方法,说明此行ADD_PASS萨尔瓦·阿里33女性0555765672文件的。仔细阅读以下代码的注释。

public static void inputPass(Scanner input, Passenger[] passenger ,File fin) throws IOException{ 
    if (indexPassenger<passenger.length) { 
     passenger[indexPassenger]=new Passenger(); 
     String name=input.next();//Taking ADD_PASS instead of Salwa 
     passenger[indexPassenger].setname(name); 
      int age=input.nextInt();//Trying to take an integer but found string Salwa thus occurred InputMisMatchException. 
     passenger[indexPassenger].setage(age); 
      char gender=input.nextLine().charAt(0); 
     passenger[indexPassenger].setgender(gender); 
       String d=input.next(); 
         passenger[indexPassenger].setphone(d); 

    indexPassenger++; 

    }} 

** INT年龄= input.nextInt(); //试图采取的整数,但发现字符串莎勒瓦从而发生InputMismatchException时。

试试这个,

public static void inputPass(Scanner input, Passenger[] passenger ,File fin) throws IOException{ 
    if (indexPassenger<passenger.length) { 
     String not_in_use=input.next();//avoiding ADD_PASS 
     passenger[indexPassenger]=new Passenger(); 
     String first_name=input.next();//taking first name 
     String last_name=input.next();//taking last name 
     passenger[indexPassenger].setname(first_name+" "+last_name); 
      int age=input.nextInt();//taking age 
     passenger[indexPassenger].setage(age); 
      String gender=input.next();//taking gender 
     passenger[indexPassenger].setgender(gender.toCharArray()[0]); 
       String d=input.next();//taking phone number 
         passenger[indexPassenger].setphone(d); 

    indexPassenger++; 

    }} 
+0

非常感谢你:)))))))) – user4746449

+0

PLZ你能正确的inputPasenger – user4746449

+0

欢迎。我为你的inputPass(...)方法编辑了我的答案,但是我没有在我的计算机上运行这个,但我希望这会起作用。 –

1

为了简单,我们可以尝试这样的:

while (input.hasNextLine()) { 
    String s=input.nextLine(); 
    if(s.startsWith("ADD_FLIGHT")) { 
     // Add to list of Flight DTO 
    } 
    else if(s.startsWith("ADD_PASS")) { 
     // Add to list of passanger DTO 
    } 

    s = null; 
} 

我怀疑你的文本文件的第一行:

flightCode is coming as : ADD_FLIGHT 
ctyfrom coming as : SV223 
ctyto is coming as : Jeddah 
and total is coming as "NewYork" which can't be converted into int. 

你可以把Sysout验证一下,或者放一个调试点。

如果我的怀疑是正确的,那么只是线String flightCode=input.next();之前在方法inputFlight()

+0

我试试你的编辑,但我再次有这个错误:( – user4746449

+0

我们可以看到飞行类吗?你可以检查“cityFrom”属性的类型 – Kartic

+0

虽然这可能是一般的代码的改进,但这并没有解决问题本身 – Stefan

0

添加input.next();我曾尝试用正则表达式这样做。请参见下面的代码:

List<String> filecontent = Files.readAllLines(Paths.get("abc.txt"), Charset.defaultCharset()); 

//regex for ADD_FLIGHT 
Pattern addFlight = Pattern.compile("ADD_FLIGHT (.+) (.+) (.+) (.+) (.+)"); 
//regex for ADD_PASS 
Pattern addPass = Pattern.compile("ADD_PASS (.+) (.+) (.+) (.+) (.+)"); 

for(int i=0;i<filecontent.size();i++) 
{ 
    Matcher m1 = addFlight.matcher(filecontent.get(i)); 
    while(m1.find()) 
    { 
     //System.out.println(m1.group(0)); 
     //**Add each piece of data given in each line to your object array here** 
     System.out.println(m1.group(1)); //SV221 
     System.out.println(m1.group(2)); //Jeddah 
     System.out.println(m1.group(3)); //NewYork 
     System.out.println(m1.group(4)); //30 
     System.out.println(m1.group(5)); //7000 
    } 
    Matcher m2 = addPass.matcher(filecontent.get(i)); 
    while(m2.find()) 
    { 
     //**Add each piece of data given in each line to your object array here** 
     //System.out.println(m2.group(0)); //entire sentence 
     System.out.println(m2.group(1)); //marwa 
     System.out.println(m2.group(2)); //ahmad 
     System.out.println(m2.group(3)); //33 
     System.out.println(m2.group(4)); //F 
     System.out.println(m2.group(5)); //0555545855 
    } 
} 

每条信息添加到对象的数组 - obj.firstname,obj.lastname等。每行都执行模式匹配。

PS:我不擅长正则表达式,但这是行得通的。