2016-05-14 78 views
-3

嘿傢伙,我真的很想計算不僅c =斜邊,而且還有3或3個EditText-Views中給出的a或b。但它崩潰,不會輸出結果。有什麼建議麼?我對這個東西很新。 :)在android應用程序中的畢達哥拉斯

package net.starostka.somefunctions; 

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.text.TextUtils; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 

public class Pythagoras extends AppCompatActivity implements View.OnClickListener { 

EditText aNumPyt; 
EditText bNumPyt; 
EditText cNumPyt; 

Button pythagorasCalcu; 

TextView pythagorasResultFinal; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_pythagoras); 

    aNumPyt = (EditText) findViewById(R.id.aNumPyt); 
    bNumPyt = (EditText) findViewById(R.id.bNumPyt); 

    pythagorasCalcu = (Button) findViewById(R.id.pythagorasCalcu); 

    pythagorasResultFinal = (TextView) findViewById(R.id.pythagorasResultFinal); 

    // set a listener 
    pythagorasCalcu.setOnClickListener(this); 
} 

@Override 
public void onClick(View v) { 
    double a=0,b=0,c=0; 
    double hypot = 0.0; 

    /* 
    // check if the fields are empty 
    if (TextUtils.isEmpty(aNumPyt.getText().toString()) || TextUtils.isEmpty(bNumPyt.getText().toString()) || TextUtils.isEmpty(cNumPyt.getText().toString())) { 
     return; 
    } 
    */ 

    // read EditText and fill variables with numbers 
    a = Double.parseDouble(aNumPyt.getText().toString()); 
    b = Double.parseDouble(bNumPyt.getText().toString()); 
    c = Double.parseDouble(cNumPyt.getText().toString()); 

    if (a>b && a>c){ 
     hypot=a; 
     if(hypot*hypot==(b*b+c*c)){ 
      //result = Math.sqrt(Math.pow(a,2)+Math.pow(b,2)); 
      pythagorasResultFinal.setText(String.valueOf(hypot)); 
     } 
    } else if (b>a && b>c){ 
     hypot=b; 
     if(hypot*hypot==(a*a+c*c)){ 
      //result = Math.sqrt(Math.pow(a,2)+Math.pow(b,2)); 
      pythagorasResultFinal.setText(String.valueOf(hypot)); 
     } 
    } else if (c>a && c>b){ 
     hypot=c; 
     if(hypot*hypot==(a*a+b*b)){ 
      //result = Math.sqrt(Math.pow(a,2)+Math.pow(b,2)); 
      pythagorasResultFinal.setText(String.valueOf(hypot)); 
     } 
    } 
} 

}

XML文件

</LinearLayout> 
    <TextView 
     android:layout_height="wrap_content" 
     android:layout_width="match_parent" 
     android:layout_marginLeft="5pt" 
     android:layout_marginRight="5pt" 
     android:textSize="12pt" 
     android:layout_marginTop="3pt" 
     android:id="@+id/pythagorasResultFinal" 
     android:gravity="center_horizontal"> 
    </TextView> 

崩潰之前:

崩潰後:

+2

使用LogCat檢查與您的崩潰相關的Java堆棧跟蹤:https://stackoverflow.com/questions/23353173/unwanted-myapp-has-stopped-how-can-i-solve-this – CommonsWare

+0

也發佈logcat。 –

回答

4

編輯 有趣的是沒有一個較早指出了這一點,但我只是意識到你永遠不會初始化cNumPyt 。您初始化其他EditText s但從來沒有C.因此,當您嘗試獲取文本時,您獲得NullPointerException,因爲您嘗試從無所得到的信息。

onCreate方法中初始化正確的文本框。


在你的形象,你表明你離開輸入空白的一個文本框(在「後崩潰」的形象,我們看到,你進入3,4,再沒有什麼)。這意味着沒有Double被解析,因爲""不是一個數字。

Double documentation

public static double parseDouble(String s) throws NumberFormatException
[...]
拋出:
NullPointerException - 如果字符串爲null
NumberFormatException - 如果字符串不包含可解析的兩倍。

如果你的輸入是空白的,你會得到一個異常。由於它不在try-catch塊中,因此您的應用程序將崩潰。

更具體:

//cNumPyt is empty, and "" is not a parseable number, so NumberFormatException 
c = Double.parseDouble(cNumPyt.getText().toString()); 

樣品塊(你需要爲每一個變量單獨做到這一點,所以你可以知道哪些變量是空的):

try{ 
    a = Double.parseDouble(aNumPyt.getText().toString()); 
}catch (NumberFormatException e){ 
    //oops, no number available 
    a = 0; //default to 0 (or whatever you choose) 
} 
+0

嗯,這是有道理的,我試圖用你的示例打印什麼字母丟失,而不是崩潰..但它仍然不會工作 嘗試a = Double.parseDouble(aNumPyt.getText()。toString()) ; } catch(NumberFormatException e){oops,沒有可用的數字 a = 0; //默認爲0(或任何你選擇的) pythagorasResultFinal.setText(「No A input」); } 順便說一句:感謝您的真正快速反應 –

+0

@BenjaminStarostkaJakobsen你能比「不會工作」更具體嗎?在它仍然崩潰?你對'a','b',_and_'c'使用單獨的'try'塊嗎? – Arc676

+0

當然,對不起。它仍然是崩潰是我的意思。 這是一張圖片:http://imgur.com/AGOF7Yf –

2
@Override 
public void onClick(View v) { 
double a=0,b=0,c=0; 


if (!TextUtils.isEmpty(aNumPyt.getText().toString()) && 
    !TextUtils.isEmpty(bNumPyt.getText().toString()) && 
    !TextUtils.isEmpty(cNumPyt.getText().toString())) 

{ 

a = Double.parseDouble(aNumPyt.getText().toString()); 
b = Double.parseDouble(bNumPyt.getText().toString()); 
c = Double.parseDouble(cNumPyt.getText().toString()); 


    if((a*a)==((b*b)+(c*c))){ 
     pythagorasResultFinal.setText(String.valueOf(a)); 
    } 
    else if ((b*b)==((a*a)+(c*c))){ 
     pythagorasResultFinal.setText(String.valueOf(b)); 
    } 
    else if ((c*c)==((a*a)+(b*b))){ 
     pythagorasResultFinal.setText(String.valueOf(c)); 
    } 
} 

} 
+0

我試過你的解決方案,但問題似乎仍然存在於NumberFormatException中,因爲Arc676解釋了...即使我在空輸入中輸入0,它仍然崩潰領域。 :/ –

+0

你把android:inputType =「numberDecimal」放在你的xml文件中嗎? –

0

我發現問題.. Arc676的解決方案工作如下代碼所示:

@Override 
public void onClick(View v) { 
    double a=0.0,b=0.0,c=0.0; 
    double hypot = 0.0; 

    try{ 
     a = Double.parseDouble(aNumPyt.getText().toString()); 
    }catch (NumberFormatException e){ 
     //oops, no number available 
     a = 0.0; //default to 0 (or whatever you choose) 
    } 
    try{ 
     b = Double.parseDouble(bNumPyt.getText().toString()); 
    }catch (NumberFormatException e){ 
     //oops, no number available 
     b = 0.0; //default to 0 (or whatever you choose) 
    } 
    try{ 
     c = Double.parseDouble(cNumPyt.getText().toString()); 
    }catch (NumberFormatException e){ 
     //oops, no number available 
     c = 0.0; //default to 0 (or whatever you choose) 
    } 

    if (c == 0.0){ 
     hypot = Math.sqrt((Math.pow(a,2))+(Math.pow(b,2))); 
     pythagorasResultFinal.setText("Finding C\n" + String.valueOf(hypot)); 
    }else if (a == 0.0){ 
     hypot = Math.sqrt((Math.pow(c,2))-(Math.pow(b,2))); 
     pythagorasResultFinal.setText("Finding A\n" + String.valueOf(hypot)); 
    }else if (b == 0.0) { 
     hypot = Math.sqrt((Math.pow(c,2))-(Math.pow(a,2))); 
     pythagorasResultFinal.setText("Finding B\n" + String.valueOf(hypot)); 
    } 
} 

我發現另一個重要的問題是我沒有定義ID爲C查看..真是小問題造成這一切崩潰..

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_pythagoras); 

    aNumPyt = (EditText) findViewById(R.id.aNumPyt); 
    bNumPyt = (EditText) findViewById(R.id.bNumPyt); 
    cNumPyt = (EditText) findViewById(R.id.cNumPyt); //Forgot to add this line of code 

    pythagorasCalcu = (Button) findViewById(R.id.pythagorasCalcu); 

    pythagorasResultFinal = (TextView) findViewById(R.id.pythagorasResultFinal); 

    // set a listener 
    pythagorasCalcu.setOnClickListener(this); 
} 

感謝您的快速響應和幫助! (y)

相關問題