2012-11-16 2 views
1
//TestEmployeesProgram driver with menu & object array. 
import java.util.*; 
public class TestEmployeesProgram { 

public static Scanner console = new Scanner(System.in); 

public static void main(String[] args) 
{ 
    final int MAX = 7; 

    Employee employee[] = new Employee[MAX]; 

    int choice,k; 
    String name; 
    boolean notFound; 

    employee[1] = new Manager("Joe Bloggs","gdr",4,32.5); 
    employee[2] = new Admin("Mary Jennings","nnv",35.3,88.5,34.3); 
    employee[3] = new Clerk("Brian Jones","bbl",42.4,78.5,23.5,45.3); 
    employee[4] = new Manager("John Bloggs","gvr",5,33.5); 
    employee[5] = new Admin("Bridget Jennings","nvv",45.3,98.5,36.3); 
    employee[6] = new Clerk("Jack Jones","bbb",43.4,78.5,23.5,47.3); 


    //Initial Read 
    choice = showMenu(); 

    //Continue Until 4/Exit 
    while (choice != MAX) 
    { 
     switch (choice) 
     { 
     case 1://Manager 

      System.out.println(); 
      System.out.printf("%s %-16s %-10s %6s","Name","Id","Hours Worked","Pay"); 
      System.out.println("\n=================================================="); 

      for (k = 0; k < MAX; ++k) 
      { 
       if (employee[k] instanceof Manager){ //use of string method instance of. 


        System.out.println(employee[k].toString()); 
       } 
      } 
      break; 

     case 2://Administration 

      System.out.println(); 
      System.out.printf("%s %-16s %-10s %6s %-19s","Name","Id","Hours Worked","Pay","Admin Quota"); 
      System.out.println("\n=================================================="); 

      for (k = 0; k < MAX; ++k) 
      { 
       if (employee[k] instanceof Admin){ 
       System.out.println(employee[k].toString()); 

       } 
      } 
      break; 

     case 3://Clerk 

      System.out.println(); 
      System.out.printf("%s %-16s %-10s %6s %-19s","Name","Id","Hours Worked","Pay","Admin Quota","Units Sold"); 
      System.out.println("\n=================================================="); 

      for (k = 0; k < MAX; ++k) 
      { 
       if (employee[k] instanceof Clerk){ 
       System.out.println(employee[k].toString()); 
       } 
      } 
      break; 

이 switch 문에서이 경우 NullPointerException이 표시됩니다. 모든 것이 올바르게 초기화되었는지 확인했지만 문제를 찾을 수없는 것 같습니다. 또한 검색 기능은 이름을 찾지 못하면 이름 검색을 생략하여 기본 메시지를 가져옵니다. 몇 가지 지침을 많이 주시면 감사하겠습니다. 이 employee[0].getName()에 액세스하려고으로검색에서 널 포인터 예외 Java

 case 4://Name search 

      System.out.print("Enter employee name: "); 
      name = console.nextLine(); 

      k = -1; 
      notFound = true; 



      while ((k < MAX-1) && (notFound)) 
      { 
       ++k; 
       if (name == employee[k].getName()){ 

        System.out.println(); 
        System.out.printf("%s %-16s %-10s %6s %-19s","Name","Id","Hours Worked","Pay","Admin Quota","Units Sold"); 
        System.out.println("\n=================================================="); 

        System.out.println(employee[k].toString()); 
        System.out.println(); 
        notFound = false; 
       } 


      }//end of case 4 while. 
      if (notFound){ 
       System.out.println("Employee name not found\n"); 
      } 
      break; 

     case 7://exit 
      System.out.println("Program exiting..."); 
      System.exit(0); 

     default: 
      System.out.println("Invalid menu choice 1..3 of 7 to Exit");  
     }//end of switch 

     //sub read 
     choice = showMenu(); 

    }//end of while 
}//end of main 

//Menu method for employee selection. 
public static int showMenu() 
{ 

    int choice; 
    System.out.println(); 

    System.out.println("Employee Program Menu"); 

    System.out.println("1.Show Manager pay details "); 
    System.out.println("2.Show Admin pay details "); 
    System.out.println("3.Show Clerk pay details "); 
    System.out.println("4.Search by employee name "); 
    System.out.println("7.Exit"); 

    System.out.print("Enter option: "); 
    choice = console.nextInt(); 

    return choice; 
} 
} 
+0

순차적으로 많은 새로운 행이 있습니다. 코드가 너무 많습니다. 놀랄 만한! – Juvanis

+0

디버거에서 실행시킬 수 있었습니까? –

+1

0으로 인덱싱 된 값은 어떻게됩니까? – sp00m

답변

3

당신은 0th 인덱스 값을 설정하지 않은, 그래서 if (name == employee[0].getName()){} 예외를 생성합니다.

배열 인덱스 0에서 시작하여 크기 -1 끝나는대로 인덱스 0에 값을 설정한다

...

employee[0] = new Manager("Joe Bloggs","gdr",4,32.5); 
employee[1] = new Admin("Mary Jennings","nnv",35.3,88.5,34.3); 
... 
employee[6] = new Clerk("Jack Jones","bbb",43.4,78.5,23.5,47.3) 
+0

옙 이것은 대답이다. (그리고 내 눈은 내 눈이 없어져야한다. [0] lol –

+0

@BrianVarley 배열은 항상 [0]에서 시작한다. * 누군가가 나를 시작하기로 선택한 어떤 언어로 나를 끌어 들일 것이다. 배열 인덱스는 1이지만 헤이 –

0

자바 형상 아웃 될 수도 있지만, 경우 설정 망각하지 직원 [0]의 새 직원?

케이스 4는 k는 0으로 증가 -1 이상임과 함께 시작하지만 종업원의 종업원이 없으므로 [0] 전혀 ....

0

편집 두 번째 모습을 찍은 후에는이 모든 작업을 수행합니다. 따라서 코드를 살펴보고 어레이가 제대로 초기화되었는지 확인하십시오. 또한 스위치 문에 명명 된 상수를 사용해 볼 수도 있습니다. 가독성을 높이는 데 도움이되는 것으로 나타났습니다 (나와 같은 학생 인 경우 마법 숫자에 대한 점수를 잃지 않음).

final int MANAGER = 1; 

    final int CLERK = 2; 

    switch(choice) 
    { 
      case MANAGER: foo; 
       break; 
      case CLERK: foo; 
       break; 
    } 

이것은 문제 코드입니다. 컨트롤의 흐름이 if 문에 도달하면 k는 0과 같고 배열의 0 번째 요소가 없으므로 java가 null 포인터 예외를 throw합니다.

나중에 참조 할 수 있도록 컴파일러에서 제공하는 실제 오류를 살펴보십시오. 컴파일러는 줄 번호를 제공하므로 오류를 쉽게 추적 할 수 있습니다. Java는 null 포인터에 관해서는 당신에게 정말 좋으며, C++은 잘못된 위치에서 발견 된 값을 사용하여 계속 실행됩니다.

 k = -1; 
     notFound = true; 



     while ((k < MAX-1) && (notFound)) 
     { 
      ++k; 
      if (name == employee[k].getName())