Erreur de calculatrice avec message d'erreur de commutateur java eclipse


Donc j'essaie de faire un simple calc mais j'ai quelques problèmes Message d'erreur: Plusieurs marqueurs sur cette ligne - Aucune instance englobante de type Application n'est accessible. Doit qualifier l'allocation avec une instance englobante de type Application (par exemple x. new A () où x est une instance d'application). - Point d'arrêt de ligne: Application [ligne: 64] - main (Chaîne[])

Qu'est-ce que je fais de mal? Quelqu'un pourrait-il voir quelque chose de mal et le réparer plz?

public class Application {
interface MathOp {
    public double doMath(double a, double b);
    }

    class Add implements MathOp{

      public double doMath(double a, double b) {
        return (a + b);
      }

    }

    class Sub implements MathOp{

      public double doMath(double a, double b) {
        return (a - b);
      }

    }
    class Div implements MathOp{

        public double doMath(double a, double b){
            return (a / b);
        }
    }
    class Mul implements MathOp{

        public double doMath(double a, double b){
            return (a * b);
        }
    }

public static void main(String[] args) {



            Scanner sc = new Scanner(System.in);
            double a,b,c;
            int choice = 0;
            a=b=c=0.0;
            while(true) {
              System.out.println("Enter two numbers");
              a = Double.parseDouble(sc.nextLine());
              b = Double.parseDouble(sc.nextLine());

              System.out.println("Enter your choice");
              System.out.println("1. Add");
              System.out.println("2. Sub");
              System.out.println("3. Mul");
              System.out.println("4. Div");

              choice = Integer.parseInt(sc.nextLine());

              switch(choice) {
               case 1 :
                      c = new Add().doMath(a,b);
                      break;
               case 2 :
                      c = new Sub().doMath(a,b);
                      break;
               case 3 :
                      c = new Div().doMath(a,b);
                      break;
               case 4 :
                      c = new Mul().doMath(a,b);
                      break;
               default:
                       break;

               }
              System.out.println(c + "this is the answere");


              System.out.println("would you like to continue? (Y/N)");
              if("N".equalsIgnoreCase(sc.nextLine())) { // careful with the paranthesis 
                break;
              }
            }

}

Author: user2825771, 2013-09-28

1 answers

Le problème est que votre Add, Sub les classes etc sont les classes internes, ce qui signifie que vous devez avoir une instance de la classe conteneur... ce que vous ne faites pas à ce stade.

Options:

  • (Meilleur!) Débarrassez-vous de votre interface, en créant plutôt un enum (au niveau supérieur; non imbriqué) qui a un membre pour chaque opération. L'énumération déclarerait une méthode abstraite, qui serait alors remplacée dans chaque membre:

    public enum MathOperation {
        ADDITION { 
            @Override public double doMath(double a, double b) {
                return a + b;
            }
        },
        SUBTRACTION { 
            @Override public double doMath(double a, double b) {
                return a - b;
            }
        }
        // etc
        ;
    
        public abstract double doMath(double a, double b);
    }
    
  • (Ok) Gardez le interface et les classes d'implémentation, mais déplacez-les en dehors de votre classe Application. Les types imbriqués devraient être assez rares, IMO.
  • (Pas génial) Ajoutez le modificateur static à chacune des classes d'implémentation. Ils seraient toujours imbriqués, mais ils ne nécessiteraient pas de référence implicite à une instance de Application.
  • (Urrgh!) Créez une instance de Application afin que vous puissiez créer une instance de vos classes d'opérations. Ne fais pas ça. Je ne l'inclus que pour exhaustivité.

Bien que les classes imbriquées puissent certainement être utiles, si vous êtes un nouveau venu relatif à Java, je vous suggère de les éviter pour l'instant. Ils viennent avec leurs propres règles et syntaxe qui peut être un peu étrange pour commencer. Tenez-vous en à déclarer tous vos types au niveau supérieur à la place.

 2
Author: Jon Skeet, 2013-09-28 07:12:09