用法& Java中的错误处理

时间:2018-04-21 00:03:22

标签: java java-8 either

我的目标是将Either课程与我的Human,Weapon和Magazine课程一起使用。

这些是我想要测试的不同人类声明。 (没有武器,没有武器,并且全部都有)

Human noWeapon = new Human(null);
Human noMag = new Human(new Weapon(null));
Human hasAll = new Human(new Weapon(new Magazine(2)));

目前,我正在以下列方式创建一个Either:

Human noWeapon = new Human(null);
Either <String, Human> either2 = new Right <String, Human>(noWeapon);
Right <String, Human> either2_right = (Right<String, Human>) either2;

我正在努力理解Either类的内部工作方式以及我可以用它来处理错误的方法。我希望能够在发生错误时捕获这些错误,以便我知道错误发生的时间

either2_right.getRight().getWeapon().getMag().getCount();

目前,由于显而易见的原因,这会抛出NullPointerException错误 - 但我的目标是捕获错误并知道错误发生的时间。

My Either课程如下:

abstract class Either<A, B> { }

class Left<A, B> extends Either<A, B> {
    public A left_value;
    public Left(A a) 
    { 
        left_value = a; 
    }

    public A getLeft(){
        return this.left_value;
    }

    public <B2> Either<A,B2> flatMap(final Function<B,Either<A,B2>> f){
      return (Either<A,B2>)this;
  }

  public <B2> Either<A,B2> map(final Function<B,B2> f){
      return (Either<A,B2>)this;
  }
}

class Right<A, B> extends Either<A, B> {
    public B right_value;
    public Right(B b) 
    { 
        right_value = b; 
    }

    public B getRight(){
        return this.right_value;
    }

    public <B2> Either<A,B2> flatMap(final Function<B,Either<A,B2>> f){
      return f.apply(right_value);
  }

  public <B2> Either<A,B2> map(final Function<B,B2> f){
      return new Right(f.apply(right_value));
  }
}

我在以下3个课程中使用Either: 人

class Human {
        Weapon w;

        public Human(Weapon w) 
        { 
            this.w = w; 
        }

        public Weapon getWeapon() 
        {
            return w;
        }
    }

武器:

class Weapon {
        Magazine m;

        public Weapon(Magazine m) 
        { 
            this.m = m; 
        }

        public Magazine getMag() 
        {
            return m;
        }
    }

杂志:

class Magazine {
        private int count;

        public Magazine(int c) 
        { 
            count = c; 
        }

        public int getCount() 
        { 
            return count; 
        }
    }

感谢您提供的任何帮助!

1 个答案:

答案 0 :(得分:0)

  

我正在努力理解Either类的内部工作方式以及我可以用它来处理错误的方法。

让我们从问题的第二部分开始,如何使用Either进行错误处理? Either可以包含两个值中的一个,对于错误处理,您可以声明一个方法来返回将保存有效计算结果或异常的Either。例如:

public Either<ArithmeticException, Double> divide (Double x, Double y) {
    try {
      return new Right<ArithmeticException, Double>(x/y);
    } catch (ArithmeticException e) {
      return new Left<ArithmeticException, Double>(e);
    }
 }

如果调用者尝试除以零,则不会得到ArithmeticException,他将收到一个Either持有异常,在此示例中,他将获得Left。惯例是在Right中保留有效的返回结果,而另一个结果为Left

您提供的实施方式不会让调用者轻松检查他是否有RightLeft,或者无论是{{1}都可以轻松处理结果或Right更完整的Left here实现提供了便利(例如Either获取getOrThrow值或抛出异常Right不是Either)。