2015-10-12 2 views
1

Я пишу программу, которая принимает два треугольника как экземпляры & определяет, являются ли они незаконными или нет, и выдает исключение, если они есть. Моя первая проблема в том, что я пытаюсь выбросить TriangleException, а не Exception. Я уверен, что мне просто нужно что-то изменить или добавить что-нибудь, чтобы он не дал мне ошибку в Eclipse.TriangleException & NonStatic toString()

Моя вторая проблема заключается в том, что я пытаюсь использовать метод toString() для вывода боковых размеров незаконного треугольника при вызове Exception. Он продолжает говорить мне, что я не могу сделать нестатические ссылки с вызовом toString(). Я посмотрел онлайн и попробовал несколько различных возможных решений, но никто из них, похоже, не работает.

Я включил мои два класса ниже:

public class TriangleException extends Object { 

    private double side1; 
    private double side2; 
    private double side3; 

    public static void main(String[] args) throws Exception { 
     try { 
      TriangleWithException t1 = new TriangleWithException(1.5, 2, 3); 
      System.out.println("Perimeter for t1: " + t1.getPerimeter()); 
      System.out.println("Area for t1: " + t1.getArea()); 

      TriangleWithException t2 = new TriangleWithException(1,2,3); 
      System.out.println("Perimeter for t2: " + t2.getPerimeter()); 
      System.out.println("Area for t2: " + t2.getArea()); 
     } 
     catch (TriangleException e){ 
      System.out.println("\nIllegal Triangle!!!"); 
      System.out.println(toString()); // trying to print the three sides of the illegal triangle here 
     } 
    } 

    public double getSide1() { 
     return side1; 
    } 

    public double getSide2() { 
     return side2; 
    } 

    public double getSide3() { 
     return side3; 
    } 
} 

public class TriangleWithException extends Object { 

    double side1, side2, side3; 

    public TriangleWithException(double d, double i, double j) throws Exception { 
     side1 = d; 
     side2 = i; 
     side3 = j; 

     if (side1 >= side2 + side3) 
      throw new TriangleException(); 
     else if (side2 >= side1 + side3) 
      throw new TriangleException(); 
     else if (side3 >= side2 + side1) 
      throw new TriangleException(); 
    } 

    public double getArea() { 
     double var = (side1 + side2 + side3)/2; 
     double area = (var*(var-side1)*(var-side2)*(var-side3)); 
     return Math.sqrt(area); 
    } 

    public double getPerimeter() { 
     return (side1+side2+side3); 
    } 

    public String toString() { 
     return "\nSide 1 = " + this.side1 + "\nSide 2 = " + this.side2 
      + "\nSide 3 = " + this.side3; 
    } 
} 

ответ

0

Вы должны расширить Exception, не Object. Object не срабатывает. Если вы проверите javadoc на Exception, вы фактически увидите, что Exception сам реализует Throwable.

0
  1. Новые Исключения, которые вы пишете, должны быть подклассифицированы Exception, а не Object.
  2. В файле Java должен присутствовать только один класс, помеченный знаком public. Поэтому, если у вас есть оба класса в одном файле, вам нужно пересмотреть его.
  3. toString() не является статическим методом, то есть нестационарным методом. Поэтому вам нужно вызвать его, используя ссылку объекта. Поэтому вместо того, чтобы просто использовать toString(), измените его на e.toString().
catch (TriangleException e){ 
    System.out.println("\nIllegal Triangle!!!"); 
    System.out.println(e.toString()); // trying to print the three sides of the illegal triangle here 
} 

Это должно сделать это.

0

Вот моя реализация для вышеуказанного кода.

  1. Для реализации пользовательских исключений, вам нужно расширить Exception не классом Object класса.
  2. Класс TriangleException должен заботиться только об исключении. Ничего больше.
  3. Вам не нужны никакие члены в классе TriangleException для удерживания сторон.
  4. TriangleWithException с передачей его ссылки, выбирая исключение. Который вы задали как сообщение в классе Exception, вызвав конструктор super().
  5. Для проверки функциональности должен быть отдельный класс драйвера. Или вы должны использовать класс TriangleWithException вместо класса исключения.
  6. Вы не должны распространять класс Object отдельно. Каждый класс по умолчанию расширяет его.
  7. В идеале, конструктор не должен выполнять проверку действительности. У вас должен быть отдельный метод isValid() для проверки действительности Треугольника.

public class TriangleException extends Exception { 

    public TriangleException(TriangleWithException e) { 
    super(e.toString()); 
    } 
} 

public class TriangleWithException { 

    double side1, side2, side3; 

    public TriangleWithException(double d, double i, double j) throws TriangleException { 
    side1 = d; 
    side2 = i; 
    side3 = j; 

    if (side1 >= side2 + side3) 
     throw new TriangleException(this); 
    else if (side2 >= side1 + side3) 
     throw new TriangleException(this); 
    else if (side3 >= side2 + side1) 
     throw new TriangleException(this); 
    } 

    public double getArea() { 
    double var = (side1 + side2 + side3)/2; 
    double area = (var*(var-side1)*(var-side2)*(var-side3)); 
    return Math.sqrt(area); 
    } 

    public double getPerimeter() { 
    return (side1+side2+side3); 
    } 

    @Override 
    public String toString() { 
    return "\nSide 1 = " + this.side1 + "\nSide 2 = " + this.side2 
     + "\nSide 3 = " + this.side3; 
    } 
}  

public class Main { 
    public static void main(String[] args) throws Exception { 

    try { 
     TriangleWithException t1 = new TriangleWithException(1.5, 2, 3); 
     System.out.println("Perimeter for t1: " + t1.getPerimeter()); 
     System.out.println("Area for t1: " + t1.getArea()); 

     TriangleWithException t2 = new TriangleWithException(1,2,3); 
     System.out.println("Perimeter for t2: " + t2.getPerimeter()); 
     System.out.println("Area for t2: " + t2.getArea()); 
    } 
    catch (TriangleException e){ 
     System.out.println("\nIllegal Triangle!!!"); 
     System.out.println(e.getMessage()); // trying to print the three sides of the illegal triangle here 
    } 
    }  
} 

Выход:

Perimeter for t1: 6.5 
Area for t1: 1.3331705629813464 

Illegal Triangle!!! 

Side 1 = 1.0 
Side 2 = 2.0 
Side 3 = 3.0 
Смежные вопросы