2011-03-19 3 views
0

내 프로그램을 얻기 내가 스레드에서이 오류를자바 - Heres는 StackOverflowError가

예외가 계속 "주" java.lang.StackOverflowError의는

이 할당

입니다 설명
이 프로그램의 경우 Quarterback 클래스를 만들어야합니다. 이것은 NFL에서 쿼터백을 나타내는 이라는 간단한 개체입니다. 이 클래스를 구현하는 데 도움이되는 개인용 메서드 또는 메서드를 추가로 만들 수도 있습니다.

package quarterback;  
public class Quarterback 
{ 

    private int attempts; 
    private int completions; 
    private String firstName; 
    private int interceptions; 
    private String lastName; 
    private int touchdowns; 
    private int yards; 
    private int passerRating; 
    //************************************************************ 
    public Quarterback() 
    { 
     new Quarterback(); 
    } 

    //**************************************************************** 

    public Quarterback(String firstName, String lastName, int completions, int attempts, int yards, int interceptions, int touchdowns) 
    { 
     this.firstName = firstName; 
     this.lastName = lastName; 
     this.completions = completions; 
     this.attempts = attempts; 
     this.yards = yards; 
     this.interceptions = interceptions; 
     this.touchdowns = touchdowns; 

    } 

     //***************************************************************** 

    public Quarterback copy() 
    { 
     Quarterback o = new Quarterback(); 
     o.firstName = this.firstName; 
     o.lastName = this.lastName; 
     o.completions = this.completions; 
     o.attempts = this.attempts; 
     o.yards = this.yards; 
     o.interceptions = this.interceptions; 
     o.touchdowns = this.touchdowns; 
     return o; 



    } 

     //****************************************************************** 

    public boolean equals(Object o) 
    { 
     if (((Quarterback) o).getAttempts() == this.attempts) return true; 
     if (((Quarterback) o).getCompletions() == this.completions) return true; 
     if (((Quarterback) o).getFirstName() == this.firstName) return true; 
     if (((Quarterback) o).getInterceptions() == this.interceptions) return true; 
     if (((Quarterback) o).getLastName() == this.getLastName()) return true; 
     if (((Quarterback) o).getTouchdowns() == this.touchdowns) return true; 
     if (((Quarterback) o).getYards() == this.yards) return true; 

     return false; 
    } 



     //********************************************************************* 

    public int getAttempts() 
    { 
     return this.attempts; 
    } 

     //******************************************************************************* 

    public int getCompletions() 
    { 
     return this.completions; 
    } 

     //********************************************************** 

    public String getFirstName() 
    { 
     return this.firstName; 
    } 

     //******************************************************************************* 

    public int getInterceptions() 
    { 
     return this.interceptions; 

    } 

     //**************************************************************************** 

    public String getLastName() 
    { 
     return this.lastName; 
    } 

     //**************************************************************************** 

    public double getRating(int a, int b, int c, int d, int passerRating) 
    { 
     a = (int) (((this.completions/this.attempts)-.3)*5); 
     b = (int) (((this.yards/this.attempts)-3)*.25); 
     c = ((this.touchdowns/this.attempts) *20); 
     d = (int) (((this.interceptions/this.attempts)*25)-2.375); 

     passerRating = (((a + b + c + d)/6)*100); 
     return passerRating; 
    } 

     //**************************************************************************** 

    public int getTouchdowns() 
    { 
     return this.touchdowns; 

    } 

     //***************************************************************************** 

    public int getYards() 
    { 
     return this.yards; 
    } 

      //*************************** 

    public void setAttempts(int attempts) 
    { 
     this.attempts = attempts; 

    } 

     //******************************************************************************* 

    public void setCompletions(int completions) 
    { 
     this.completions = completions; 

    } 

     //******************************************************************************* 

    public void setFirstName(String firstName) 
    { 
     this.firstName = firstName; 

    } 
     //******************************************************************************* 

    public void setInterceptions(int interceptions) 
    { 
     this.interceptions = interceptions; 
    } 
     //***************************************************************************** 

    public void setLastName(String lastName) 
    { 
    this.lastName = lastName; 
    } 
     //***************************************************************************** 

    public void setTouchdowns(int touchdowns) 
    { 
     this.touchdowns = touchdowns; 
    } 
     //***********************************************       

    public void setYards(int yards) 
    { 
     this.yards = yards; 
    } 
      //***************************************************************************** 

    public String toString() 
    { 
     System.out.println(this.firstName + " " + this.lastName + passerRating); 
     return toString(); 
    } 
} 

을 heres 드라이버

package quarterback; 

import java.util.Scanner; 

public class QBtester { 


    public static void main(String[] args) { 
     // Create a Quarterback 
     Quarterback qb = new Quarterback(); 

     // Test OK quarterback 
     qb.setFirstName("qb"); 
     qb.setLastName("ok"); 
     qb.setAttempts(465); 
     qb.setCompletions(272); 
     qb.setYards(2972); 
     qb.setTouchdowns(18); 
     qb.setInterceptions(12); 
     if ("qb ok 79.6".equals(qb.toString())) { 
      System.out.println("Passed OK QB"); 
     } else { 
      System.out.println("Failed OK QB"); 
      System.out.println("Expected: qb ok 79.6"); 
      System.out.println("Got: " + qb); 
     } 

     // Test max quarterback 
     qb.setFirstName("qb"); 
     qb.setLastName("max"); 
     qb.setAttempts(100); 
     qb.setCompletions(78); 
     qb.setYards(1275); 
     qb.setTouchdowns(12); 
     qb.setInterceptions(0); 
     if ("qb max 158.3".equals(qb.toString())) { 
      System.out.println("Passed max QB"); 
     } else { 
      System.out.println("Failed max QB"); 
      System.out.println("Expected: qb max 158.3"); 
      System.out.println("Got: " + qb); 
     } 

     // Test completions too high 
     qb.setFirstName("qb"); 
     qb.setLastName("comp2hi"); 
     qb.setAttempts(100); 
     qb.setCompletions(78); 
     qb.setYards(1000); 
     qb.setTouchdowns(7); 
     qb.setInterceptions(5); 
     if ("qb comp2hi 110.8".equals(qb.toString())) { 
      System.out.println("Passed completions too high"); 
     } else { 
      System.out.println("Failed completions too high"); 
      System.out.println("Expected: qb comp2hi 110.8"); 
      System.out.println("Got: " + qb); 
     } 

     // Test completions too low 
     qb.setFirstName("qb"); 
     qb.setLastName("comp2low"); 
     qb.setAttempts(100); 
     qb.setCompletions(25); 
     qb.setYards(1000); 
     qb.setTouchdowns(7); 
     qb.setInterceptions(5); 
     if ("qb comp2low 71.3".equals(qb.toString())) { 
      System.out.println("Passed completions too low"); 
     } else { 
      System.out.println("Failed completions too low"); 
      System.out.println("Expected: qb comp2low 71.3"); 
      System.out.println("Got: " + qb); 
     } 

     // Test completions 0 
     qb.setFirstName("qb"); 
     qb.setLastName("comp0"); 
     qb.setAttempts(100); 
     qb.setCompletions(30); 
     qb.setYards(1000); 
     qb.setTouchdowns(7); 
     qb.setInterceptions(5); 
     if ("qb comp0 71.3".equals(qb.toString())) { 
      System.out.println("Passed completions 0"); 
     } else { 
      System.out.println("Failed completions 0"); 
      System.out.println("Expected: qb comp0 71.3"); 
      System.out.println("Got: " + qb); 
     } 

     // Test yards too high 
     qb.setFirstName("qb"); 
     qb.setLastName("yards2hi"); 
     qb.setAttempts(100); 
     qb.setCompletions(50); 
     qb.setYards(1275); 
     qb.setTouchdowns(7); 
     qb.setInterceptions(5); 
     if ("qb yards2hi 98.3".equals(qb.toString())) { 
      System.out.println("Passed yards too high"); 
     } else { 
      System.out.println("Failed yards too high"); 
      System.out.println("Expected: qb yards2hi 98.3"); 
      System.out.println("Got: " + qb); 
     } 

     // Test yards too low 
     qb.setFirstName("qb"); 
     qb.setLastName("yards2low"); 
     qb.setAttempts(100); 
     qb.setCompletions(50); 
     qb.setYards(250); 
     qb.setTouchdowns(7); 
     qb.setInterceptions(5); 
     if ("qb yards2low 58.8".equals(qb.toString())) { 
      System.out.println("Passed yards too low"); 
     } else { 
      System.out.println("Failed yards too low"); 
      System.out.println("Expected: qb yards2low 58.8"); 
      System.out.println("Got: " + qb); 
     } 

     // Test yards 0 
     qb.setFirstName("qb"); 
     qb.setLastName("yards0"); 
     qb.setAttempts(100); 
     qb.setCompletions(50); 
     qb.setYards(300); 
     qb.setTouchdowns(7); 
     qb.setInterceptions(5); 
     if ("qb yards0 58.8".equals(qb.toString())) { 
      System.out.println("Passed yards 0"); 
     } else { 
      System.out.println("Failed yards 0"); 
      System.out.println("Expected: qb yards0 58.8"); 
      System.out.println("Got: " + qb); 
     } 

     // Test td too high 
     qb.setFirstName("qb"); 
     qb.setLastName("td2hi"); 
     qb.setAttempts(100); 
     qb.setCompletions(50); 
     qb.setYards(1000); 
     qb.setTouchdowns(14); 
     qb.setInterceptions(5); 
     if ("qb td2hi 104.2".equals(qb.toString())) { 
      System.out.println("Passed td too high"); 
     } else { 
      System.out.println("Failed td too high"); 
      System.out.println("Expected: qb td2hi 104.2"); 
      System.out.println("Got: " + qb); 
     } 

     // Test td 0 
     qb.setFirstName("qb"); 
     qb.setLastName("td0"); 
     qb.setAttempts(100); 
     qb.setCompletions(50); 
     qb.setYards(1000); 
     qb.setTouchdowns(0); 
     qb.setInterceptions(5); 
     if ("qb td0 64.6".equals(qb.toString())) { 
      System.out.println("Passed td 0"); 
     } else { 
      System.out.println("Failed td 0"); 
      System.out.println("Expected: qb td0 64.6"); 
      System.out.println("Got: " + qb); 
     } 

     // Test int too low 
     qb.setFirstName("qb"); 
     qb.setLastName("int2low"); 
     qb.setAttempts(100); 
     qb.setCompletions(50); 
     qb.setYards(1000); 
     qb.setTouchdowns(7); 
     qb.setInterceptions(11); 
     if ("qb int2low 69.2".equals(qb.toString())) { 
      System.out.println("Passed int too low"); 
     } else { 
      System.out.println("Failed int too low"); 
      System.out.println("Expected: qb int2low 69.2"); 
      System.out.println("Got: " + qb); 
     } 

     // Test int 0 
     qb.setFirstName("qb"); 
     qb.setLastName("int0"); 
     qb.setAttempts(1000); 
     qb.setCompletions(500); 
     qb.setYards(10000); 
     qb.setTouchdowns(70); 
     qb.setInterceptions(95); 
     if ("qb int0 69.2".equals(qb.toString())) { 
      System.out.println("Passed int 0"); 
     } else { 
      System.out.println("Failed int 0"); 
      System.out.println("Expected: qb int0 69.2"); 
      System.out.println("Got: " + qb); 
     } 

     // Test copy and equals 
     Quarterback qbcopy = new Quarterback(); 
     qbcopy = qb.copy(); 
     if (qbcopy.equals(qb)) { 
      // copy and equals works 
      System.out.println("Passed qb copy and equals"); 
     } else { 
      System.out.println("Failed qb copy and equals"); 
      System.out.println("Original qb: " + qb); 
      System.out.println("Copied qb: " + qbcopy); 
     } 

    } 

} 

답변

9
public Quarterback() 
{ 
    new Quarterback(); 
} 

이 코드는 무한 순환 루프로 진행한다. new Quarterback(); 행을 삭제합니다. 필드의 어떤가 동일한 경우

그리고 우리는 숙제 도움을 다하고 있기 때문에 ... public boolean equals(Object o)에서

, 당신은 진정한 반환하고 있습니다. 더 많은 경우에 필드의이 동일하고 true를 반환하기 전에 (&& 연산자 사용).

getRating 함수에는 실제로 매개 변수가 필요하지 않습니다. 삭제할 수 있습니다.

관련 평가에서 통과 평점이 계산되지 않으므로 드라이버 프로그램이 항상 실패합니다. getRating에 대한 매개 변수를 제거한 후에는 passerRating을 의 getRating()으로 대체하십시오.

+0

감사합니다. – Dakota

0

또한 또 다른 문제는 반복적으로 단지 다음과 같이 예상 문자열을 반환로 변경이라고 Quarterback 클래스의 toString(),

public String toString() { 
    return this.firstName + " " + this.lastName + " " + getRating(); 
} 

그리고 Quarterback 객체의 별도의 copy()을 쓸 필요가 상태를 복사하지 않으려면입니다 다음과 같이 ... 그 클래스 Quarterback에 의해 Cloneable 인터페이스를 구현하기 전에 메소드는

public Quarterback clone() throws CloneNotSupportedException { 
    Quarterback qb = (Quarterback) super.clone(); 
    return qb; 
} 

에서, clone() 메소드를 오버라이드 (override) QBtester 전화 번호 :

Quarterback qbCopy = null; 
    try { 
    qbCopy = qb.clone(); 
    } catch (CloneNotSupportedException e) { 
} 
관련 문제