【问题标题】:Custom exception handling in Java, how do I only print out my argument in exception object without calling the a outside class?Java中的自定义异常处理,如何只在异常对象中打印出我的参数而不调用外部类?
【发布时间】:2019-11-16 09:43:28
【问题描述】:

这是 TriangleExtra 类的代码。它构造了 3 个边的三角形(用 Java 编写):

public class TriangleExtra extends SimpleGeometricObject {
    private double side1;
    private double side2;
    private double side3;
    private static int numberOfObjects;

    //Constructor 1
    public TriangleExtra() throws IllegalTriangleException {
        super("Yellow", false);
        numberOfObjects += 1;
        try {
            checkLegality(1, 1, 1);
            setSide1(1);
            setSide2(1);
            setSide3(1);
        } catch (IllegalTriangleException ex) {
            ex.printStackTrace();
            }
    } // end constructor 1

    //Constructor 2
    public TriangleExtra(double side) throws IllegalTriangleException {
        super("Blue", true);
        numberOfObjects += 1;
        try {
            checkLegality(side, side, side);    
            setSide1(side);
            setSide2(side);
            setSide3(side);
        } catch (IllegalTriangleException ex) {
            ex.printStackTrace();
            }
    } // end contructor 2

    //Contructor 3
    public TriangleExtra(double side1, double side2, double side3) throws IllegalTriangleException {
        super("Red", false);
        numberOfObjects += 1;
        try {
            checkLegality(side1, side2, side3); 
            setSide1(side1);
            setSide2(side2);
            setSide3(side3);
        } catch (IllegalTriangleException ex) {
            ex.printStackTrace();
            }
    } // end constructor 3

    //Check if it's valid triangle
    public boolean checkLegality (double side1, double side2, double side3) 
            throws IllegalTriangleException {
        boolean testSides = (side3 + side2 > side1) & 
                (side1 > Math.abs(side3 - side2));
        boolean testPositive = (side1 > 0 & side2 > 0 & side3 > 0);
        if (testSides & testPositive)
            return true;
        else
            throw new IllegalTriangleException(side1, side2, side3);
    } // end checkLegality

    //Get side methods
    public double getSide1() {
        return this.side1;
    }
    public double getSide2() {
        return this.side2;
    }
    public double getSide3() {
        return this.side3;
    }  // end get sides

    //Set side methods
    private void setSide1(double side1) {
        this.side1 = side1;
    }
    private void setSide2(double side2) {
        this.side2 = side2;
    }
    private void setSide3(double side3) {
        this.side3 = side3;
    } // end set sides

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

    // get perimeter
    public double getPerimeter() {
        return side1 + side2 + side3;
    } // end get Perimeter

    public boolean equals(Object other) {
        return (this.getSide1() == ((Triangle)other).getSide1() &
                this.getSide2() == ((Triangle)other).getSide2() &
                this.getSide3() == ((Triangle)other).getSide3());
    } // end equal()

    //get nr of objects (eve if invalid)
    public static int getNrOfObjects() {
        return numberOfObjects;
    }

    //to string
    @Override
    public String toString() {
        String s = isFilled() ? "yes": "no";
        return "Sides: " + side1 + " " + side2 + " " + side3 +
                "\nBuilt on " + getDateBuilt() + "\ncolor: " + 
                getColor() + "\nFilled: " + s;
    } // end toString

}

这是上面的类在其 checkLegality 方法中使用的 IllegalTriangleException:

public class IllegalTriangleException extends Exception {
    private double side1;
    private double side2;
    private double side3;

    public IllegalTriangleException (double side1, 
            double side2, double side3) {
        super("Invalid triangle with sides " + side1 + " "
                + side2 + " and " + side3);
        this.side1 = side1;
        this.side2 = side2;
        this.side3 = side3;
    }
}

这是我测试运行 TriangleExtra 对象的另一个类:

public class TriangleExtraTry {

    public static void main(String[] args) {
        try {
            TriangleExtra tr1 = new TriangleExtra(5);
            tr1.checkLegality(5, -1, 5);
            TriangleExtra tr2 = new TriangleExtra(1000, 1, 1);
            TriangleExtra tr3 = new TriangleExtra(-5, 5, 5);
            TriangleExtra tr4 = new TriangleExtra(0, 5, 4);

        }   catch (IllegalTriangleException ex) {
            System.out.println(ex);

        } 

          System.out.println("Number of objects constructed: " +
            TriangleExtra.getNrOfObjects());
        }
}

这是我得到的输出:

IllegalTriangleException: Invalid triangle with sides 1000.0 1.0 and 1.0
    at TriangleExtra.checkLegality(TriangleExtra.java:63)
    at TriangleExtra.<init>(TriangleExtra.java:44)
    at TriangleExtraTry.main(TriangleExtraTry.java:7)
IllegalTriangleException: Invalid triangle with sides -5.0 5.0 and 5.0
    at TriangleExtra.checkLegality(TriangleExtra.java:63)
    at TriangleExtra.<init>(TriangleExtra.java:44)
    at TriangleExtraTry.main(TriangleExtraTry.java:8)
IllegalTriangleException: Invalid triangle with sides 0.0 5.0 and 4.0
    at TriangleExtra.checkLegality(TriangleExtra.java:63)
    at TriangleExtra.<init>(TriangleExtra.java:44)
    at TriangleExtraTry.main(TriangleExtraTry.java:9)
IllegalTriangleException: Invalid triangle with sides 5.0 -1.0 and 5.0
Number of objects constructed: 4

当我从上面的代码中删除行 tr1.checkLegality(5, -1, 5); 并从 TriangleExtra 的构造函数方法中推迟“抛出 IllegalTriangleException”时,它不起作用,它只是说“IllegalTriangleException 的无法到达的捕获块。这个异常永远不会被抛出来自 try 语句体”。如果我只删除tr1.checkLegality(5, -1, 5);,那么它不会写最后一行IllegalTriangleException: Invalid triangle with sides 5.0 -1.0 and 5.0

当我写这个时:

public class TriangleExtraTry {

    public static void main(String[] args) {
        try {
            TriangleExtra tr1 = new TriangleExtra(5);
            TriangleExtra tr2 = new TriangleExtra(1000, 1, 1);
            TriangleExtra tr3 = new TriangleExtra(-5, 5, 5);
            TriangleExtra tr4 = new TriangleExtra(0, 5, 4);
            tr1.checkLegality(5, -5, 3);
        }   catch (IllegalTriangleException ex) {
            throw ex;    
        } 

          System.out.println("Number of objects constructed: " +
            TriangleExtra.getNrOfObjects());
        }
}

它说“未处理的异常类型”。我不明白发生了什么?

我需要更改什么,以便它只打印出来(IllegalTriangleException: Invalid triangle with side1 side2 and side3),而不必在 TryTriangleExtra 上调用方法 xx.checkLegality?

我的意思是没有这条线tr1.checkLegality(5, -5, 3);

我如何只得到这个输出:

IllegalTriangleException: Invalid triangle with sides 1000.0 1.0 and 1.0
IllegalTriangleException: Invalid triangle with sides -5.0 5.0 and 5.0
IllegalTriangleException: Invalid triangle with sides 0.0 5.0 and 4.0
Number of objects constructed: 4

使用此尝试代码:

public class TriangleExtraTry {

    public static void main(String[] args) {
        try {
            TriangleExtra tr1 = new TriangleExtra(5);
            TriangleExtra tr2 = new TriangleExtra(1000, 1, 1);
            TriangleExtra tr3 = new TriangleExtra(-5, 5, 5);
            TriangleExtra tr4 = new TriangleExtra(0, 5, 4);
        }   catch (IllegalTriangleException ex) {
            // something code    
        } 

          System.out.println("Number of objects constructed: " +
            TriangleExtra.getNrOfObjects());
        }
}

【问题讨论】:

    标签: java exception try-catch


    【解决方案1】:

    有两种方法可以做到这一点。

    1. 首先将从TriangleExtra 类的构造函数中删除所有try-catch 语句。完成后,您可以使用 main 方法在类中使用此语句代替“// 某些代码”。请注意,使用这种方法,主方法的 try-catch 将在抛出异常的情况下完成,并且不会处理所有剩余的构造函数调用。但这是使用 Exceptions 的权利,因为构造函数有 throws 子句,但您实际上是在构造函数本身内部处理异常。

      System.out.println("IllegalTriangleException: " + ex.getMessage());
      
    2. 第二种方法是更改​​每个构造函数中的 catch 块,而不是执行e.printstacktrace()。如果要在每个构造函数中处理异常,则从所有构造函数中删除 throws 子句,并从 main 方法中删除 try-catch。

      } catch (IllegalTriangleException ex) {
          System.out.println("IllegalTriangleException: " + ex.getMessage());
      }
      

    试一试,然后选择最适合您需求的。

    【讨论】:

      【解决方案2】:

      试试

      System.out.println("IllegalTriangleException: " + ex.getMessage());

      希望对你有帮助:)

      【讨论】:

      • 我把它放在最后一个代码中,现在它说“//something code”。我仍然得到相同的输出。
      • 是的,我明白了,事实上你得到了这个结果,因为在 TriangleExtra 构造函数中你有一个 try-catch 块,你可以在其中打印异常堆栈跟踪。 SudoRahul 的回答涵盖了这一点:)
      【解决方案3】:

      它说“未处理的异常类型”。我不明白发生了什么?

      注意:它说因为 main 中的代码抛出了一个未处理的异常。 (把throw ex 不处理代码,只是抛出它)。为了解决这个问题,您应该删除throw ex,或将throws IllegalTriangleException 添加到主函数标记中。

      为了打印这个:

      IllegalTriangleException: Invalid triangle with sides 1000.0 1.0 and 1.0
      IllegalTriangleException: Invalid triangle with sides -5.0 5.0 and 5.0
      IllegalTriangleException: Invalid triangle with sides 0.0 5.0 and 4.0
      Number of objects constructed: 4
      

      你应该这样做:

          try {
              TriangleExtra tr1 = new TriangleExtra(5);
          }   catch (IllegalTriangleException ex) {
              System.out.println("IllegalTriangleException: " + ex.getMessage());
          }
          try {
              TriangleExtra tr2 = new TriangleExtra(1000, 1, 1);
          }   catch (IllegalTriangleException ex) {
              System.out.println("IllegalTriangleException: " + ex.getMessage());
          }
          try {
              TriangleExtra tr3 = new TriangleExtra(-5, 5, 5);
          }   catch (IllegalTriangleException ex) {
              System.out.println("IllegalTriangleException: " + ex.getMessage());
          }
          try {
              TriangleExtra tr4 = new TriangleExtra(0, 5, 4);
          }   catch (IllegalTriangleException ex) {
              System.out.println("IllegalTriangleException: " + ex.getMessage());
          }
      

      因为当你在try的一个块中编写所有代码时,在第一行代码之后,它会抛出异常,并且不会到达其他代码行。如果你想创建所有 4 个三角形,彼此不依赖,你应该用自己的 try-catch 块包装每个三角形

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-05-25
        • 1970-01-01
        • 1970-01-01
        • 2019-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多