2013-12-10 1 views
0

프로그램을 컴파일 할 때이 오류가 발생합니다. 스레드 "주요"java.lang.ArrayIndexOutOfBoundsException의스레드 "main"의 예외 java.lang.ArrayIndexOutOfBoundsException : 0 at proj5.main (proj5.java:15)

예외 : proj5.main에서 0 (proj5.java:15) 나는 오류 더블 클릭하면

는 나에게 "문자열 출처 = 인수를 [지시 0]; " ,

import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.IOException; 

public class proj5 { 

    public static void main(String[] args) { 
     //validates command line 
     if(args == null || args.length != 6){ 
      System.out.println("Invalid command line arguments"); 
      System.out.println("Usage: Project5 [origin] [minSpeed] [maxSpeed] [maxBoxcars] [inputFile] [outputFile]"); 
     } 

     //gets arguments   
     String origin = args[0]; 
     int minSpeed = Integer.parseInt(args[1]); 
     int maxSpeed = Integer.parseInt(args[2]); 
     int maxBoxcars = Integer.parseInt(args[3]); 
     String inputFile = args[4]; 
     String logFile = args[5]; 

     //create new train log 
     TLog log = new TLog(logFile); 
     try { 
      log.createFile(); 
     }catch(Exception ex){ 
      System.out.println("Failed to create output file"); 
     } 

     //create train 
     Train train = new Train(origin, minSpeed, maxSpeed, maxBoxcars, log); 
     //read file 
     readFile(inputFile, train); 
    } 

    private static void readFile(String inputFile, Train train){ 
     boolean quit = false; 

     BufferedReader br = null; 

     try { 
      String line; 

      //reader for file 
      br = new BufferedReader(new FileReader(inputFile)); 
      //loop until end of file or quit 
      while (!quit && ((line = br.readLine()) != null)) { 
       //get commands 
       if(line.equals("PRINT")){ 
        //PRINT 
        train.logCommand("PRINT", new String[]{}); 
        train.printStatus();      
       } else if(line.equals("ARRIVE")){//ARRIVE 
        train.logCommand("ARRIVE", new String[]{}); 
        train.setArrived(); 
       } else if(line.equals("DEPART")){//DEPART 
        String city = br.readLine(); 
        train.logCommand("DEPART", new String[]{city}); 

        train.setDeparted(city); 
       }else if(line.equals("SPEEDUP")){//SPEEDUP 
        int mph = Integer.parseInt(br.readLine()); 
        train.logCommand("SPEEDUP", new String[]{String.valueOf(mph)}); 
        train.speedUp(mph); 
       }else if(line.equals("SLOWDOWN")){//SLOWDOWN 
        int mph = Integer.parseInt(br.readLine()); 
        train.logCommand("SLOWDOWN", new String[]{String.valueOf(mph)}); 
        train.slowDown(mph); 
       }else if(line.equals("ADDCAR")){//ADDCAR 
        String type = br.readLine(); 
        int maxElements = Integer.parseInt(br.readLine()); 
        BoxCar boxCar = null; 
        //Create new boxcar based on type 
        if(type.equals("PERSON")){ 
         boxCar = new PersonCar(maxElements); 
        }else if(type.equals("CARGO")){ 
         boxCar = new Car(maxElements); 
        } 

        train.logCommand("ADDCAR", new String[]{type, String.valueOf(maxElements)}); 
        train.addCar(boxCar); 

       }else if(line.equals("REMOVECAR")){ //REMOVECAR 
        int carNum = Integer.parseInt(br.readLine()); 
        train.logCommand("REMOVECAR", new String[]{String.valueOf(carNum)}); 
        train.removeCar(carNum);      
       }else if(line.equals("LOAD")){//LOAD 
        String cargoType = br.readLine(); 
        int boxCarId = Integer.parseInt(br.readLine()); 
        String id = br.readLine(); 

        CarContents carContents = null; 
        //create contents based upon cargo type 
        if(cargoType.equals("PERSON")){ 
         String name = br.readLine(); 
         int age = Integer.parseInt(br.readLine());     
         carContents = new Person(id, name, age);        
         train.logCommand("LOAD", new String[]{String.valueOf(boxCarId), id, name, String.valueOf(age)}); 
        } else if(cargoType.equals("CARGO")){ 
         int weight = Integer.parseInt(br.readLine()); 
         int height = Integer.parseInt(br.readLine()); 
         int width = Integer.parseInt(br.readLine()); 
         int length = Integer.parseInt(br.readLine());      
         carContents = new Cargo(id, weight, height, width, length); 
         train.logCommand("LOAD", new String[]{String.valueOf(boxCarId), String.valueOf(weight), String.valueOf(height), 
           String.valueOf(width), String.valueOf(length)}); 
        } 

        train.load(boxCarId, carContents); 

       }else if(line.equals("UNLOAD")){//UNLOAD 
        int boxCarId = Integer.parseInt(br.readLine()); 
        String cargoId = br.readLine(); 
        train.logCommand("UNLOAD", new String[]{String.valueOf(boxCarId), cargoId}); 
        train.unload(boxCarId, cargoId); 

       }else if(line.equals("QUIT")){//QUIT 

        train.logCommand("QUIT", new String[]{}); 
        train.logMessage("Quitting..."); 
        quit = true; 
       }   
      } 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       if (br != null) 
        br.close(); 
      } catch (IOException ex) { 
       ex.printStackTrace(); 
      } 
     } 

    } 
} 

내가 가진, 당신은 다른 클래스를 필요로하는 경우 알려 주시기 바랍니다 BoxCar.java, Car.java, CarContents.java, CarException.java, Cargo.java :

여기에 전체 코드입니다 Person.java, PersonCar.java, TLog.java 및 Train.java가 있습니다.

이것은 내가 얻는 유일한 오류이며 프로그램을 컴파일하고 실행하지 못하게합니다.

+0

? 메소드가 JVM에서 호출 될 때'args'는 절대'null'이 될 수 없습니다. –

+0

"나를 컴파일하는 것을 방해합니다"오류는 * 런타임 * 예외이므로 어떻게 가능합니까? –

답변

0

인자를 전달하지 않는 것처럼 보이므로 args의 0 위치에 어떻게 액세스 할 수 있습니까?

4

오류가 라인에있는 경우 :

String origin = args[0]; 

다음 당신이 프로그램에 어떤 런타임 인수를 제공하지 않는 것을 의미합니다.

인수에 대한 확인이 있지만 올바른 조치를 취하지 않고 if 블록 이후에 계속해서 실행을 진행하고 있습니다. 당신은 ArrayIndexOutOfBoundException을 피하기 위해 else 블록의 코드의 당신의 나머지를 이동할 수 있습니다 : 당신은 어떻게 응용 프로그램을 실행하는

 //validates command line 
     if(args == null || args.length != 6){ 
      System.out.println("Invalid command line arguments"); 
      System.out.println("Usage: Project5 [origin] [minSpeed] [maxSpeed] [maxBoxcars]   [inputFile] [outputFile]"); 
     } else { 
      //rest of the code 
     } 
+0

+1 다른 사람의 부족을 알아 차리기 위해, 나는 단순히 예외를 던질 것이고 그것으로 끝날 것이다. –

+0

또는 if 조건의 끝에 return 문을 추가 할 수 있습니다. if (args == null || args.length! = 6) {... return; } –

+0

ArrayIndexOutOfBoundException을 피하기 위해 다른 블록에 코드의 나머지 부분을 넣으려고했지만 다른 아이디어가 없습니다. – user3085293

관련 문제