2017-04-25 1 views
-1

es ist eine Weile her, seit ich zuletzt hier etwas gefragt habe! Ich mache eine Android-App, und so, dieses Problem zu haben, wenn Sie diesen Code ausgeführt wird .:Java-Berechnung kehrt unendlich

Button calc = (Button) findViewById(R.id.btnCalculate); 
    calc.setOnClickListener(new View.OnClickListener() 

    { 
     public void onClick(View v) { 

      EditText number1 = (EditText) findViewById(R.id.dnp); 
      EditText number2 = (EditText) findViewById(R.id.ponte); 
      EditText number3 = (EditText) findViewById(R.id.aro); 
      EditText number4 = (EditText) findViewById(R.id.ed); 
      EditText number5 = (EditText) findViewById(R.id.esf); 
      EditText number6 = (EditText) findViewById(R.id.curvint); 
      EditText number7 = (EditText) findViewById(R.id.curvb); 
      EditText number8 = (EditText) findViewById(R.id.ind); 
      EditText number9 = (EditText) findViewById(R.id.espmin); 
      TextView display = (TextView) findViewById(R.id.display); 

      double dnp = Double.parseDouble(number1.getText().toString()); 
      double ponte = Double.parseDouble(number2.getText().toString()); 
      double aro = Double.parseDouble(number3.getText().toString()); 
      double ed = Double.parseDouble(number4.getText().toString()); 
      double esf = Double.parseDouble(number5.getText().toString()); 
      double curvint = Double.parseDouble(number6.getText().toString()); 
      double curvb = Double.parseDouble(number7.getText().toString()); 
      double ind = Double.parseDouble(number8.getText().toString()); 
      double espmin = Double.parseDouble(number9.getText().toString()); 

      double R1; 
      double R2; 
      double DT; //Decentração total 
      double DM; //Decentração monocular 
      double diametro; 
      double S1; 
      double S2; 
      double espessurafinal; 

      if (esf < 0) 
      { 

       R1 = (ind - 1/curvb) * 1000; 
       R2 = (ind - 1/curvint) * 1000; 
       DT = (aro+ponte)-dnp; 
       DM = (DT/2); 
       diametro = (ed + 2 * DM)/2; 
       S1 = R1 - (Math.sqrt(Math.exp(R1)-Math.exp(diametro))); 
       S2 = R2 - (Math.sqrt(Math.exp(R2)-Math.exp(diametro))); 
       espessurafinal = (S1 - S2) + espmin; 
       display.setText(espessurafinal + "" + "\nMilímetros"); 
      } 

      else { 

       R1 = (ind - 1/curvb) * 1000; 
       R2 = (ind - 1/curvint) * 1000; 
       DT = (aro+ponte)-dnp; 
       DM = (DT/2); 
       diametro = (ed + 2 * DM)/2; 
       S1 = R1 - (Math.sqrt(Math.exp(R1)-Math.exp(diametro))); 
       S2 = R2 - (Math.sqrt(Math.exp(R2)-Math.exp(diametro))); 
       espessurafinal = espmin - (S1 + S2); 
       display.setText(espessurafinal + "\nMilímetros"); 
      } 
     } 
    }); 

ich wahrscheinlich hier etwas sehr trivial bin fehlt, und meine Programmierkenntnisse sind sehr begrenzt, aber dieser Code-Schnipsel gibt "Infinity" zurück, wenn ich die Calculate-Taste drücke. Jetzt erhielt ich NaN und schaffte es, es loszuwerden, aber nur um es unendlich werden zu sehen! Ich recherchieren und fand heraus, dass es zu aufgrund ist eine Zahl von 0 geteilt wird, aber ich weiß nicht, dass sehen ... (Oh und ja, ich bin dafür, dass alle Zahlen eingegeben sind nicht 0)

Kann nur meine Codierung sein, die die Dinge an den falschen Stellen bringt? (Und ja, ich weiß, ich könnte den Code viel besser machen, indem ich Funktionen benutze und all das ... aber ich lerne Leute, sei sanft zu mir, lol).

Oder meine Mathematik ist sehr falsch und etwas extrem hoch zurückgeben?

Vielen Dank im Voraus jeder!

+0

Wie sieht Ihre Eingabe aus? –

+0

Es scheint, dass diese Eingabefelder eine Zeichenkette akzeptieren. Wenn Sie parse double verwenden, versucht es die gesamte Zeichenkette zu analysieren. – Remario

+0

Meine Eingaben in xml sind alle wie folgt, natürlich mit anderen IDs: Und, @Remario, ich laufe durch die instanceof jetzt ... wird bald zurück – Luis

Antwort

1

Es scheint, dass ein Teil der Eingabe nicht tatsächlich eine Zahl oder eine Zahl ist, die mit einer zufälligen Zeichenfolge gemischt ist. Führen Sie eine Validierungsprüfung der Textwerte durch, indem Sie prüfen, ob die Eingabe eine Instanz von Double ist. input instanceof Double

if(input instanceof Double) { 
    System.out.println("input is a Double"); 
    } 

Bevor Sie Instanz überprüfen können, stellen Sie sicher, dass der Eingang sauber ist, mit nur einem Java numerals.Run regulären Ausdruck ^[0-9]*$ auf den Text bearbeiten, wenn sie wahr ist dann nur Zahlen eingegeben wurden, verwenden Sie dann Double.valueOf(val) oder Double.parse() der einzige Unterschied besteht darin, dass der letztere ein Objekt vom Typ Double zurückgibt, während der andere nur einen primitiven Typ zurückgibt.

+0

nach dann können Sie alle arithmetischen Operationen auf die Eingabewerte durchführen. – Remario

+0

Auch wenn es keine gute Übung ist, umgeben Sie alle Ihre Berechnungen in einem Versuch Catch-Block. Und der catch-Block fängt eine Ausnahme (Superklasse) für alle Ausnahmen ab. Auf diese Weise können wir alle Ausnahmen abfangen. – Remario

+0

Aber wird Ihr Code-Snippet immer keine Zeichenfolge zurückgeben? – Luis