2014-12-30 4 views
-2

Если используется (loanAmtValue! = Null), то он выдает ошибку, т. Е. «Оператор! = Не может применяться к float, null». Plzz sum1 придумал решение этой проблемы. Приложение выйдет из строя, если в этом поле не указано значение. Поэтому я пытался использовать проверку нулевого состояния, чтобы приложение не разбивалось, даже если значение не задано.Float variable! = Null not working

public class SICalculatorActivity extends Activity implements View.OnClickListener { 

    private Button submit; 
    private Button submit2; 
    SeekBar sb; 
    TextView yrs; 
    EditText loanAmt; 
    EditText roi; 
    TextView siResult; 

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

     final int years; 
     sb = (SeekBar)findViewById(R.id.set_years); 
     yrs = (TextView)findViewById(R.id.years); 

     sb.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 

      @Override 
      public void onProgressChanged(SeekBar seekBar, int i, boolean b) { 

       yrs.setText(sb.getProgress()+" year(s)"); 
      } 

      @Override 
      public void onStartTrackingTouch(SeekBar seekBar) { 

      } 

      @Override 
      public void onStopTrackingTouch(SeekBar seekBar) { 

      } 
     }); 

     addButtonClickListener(); 
    } 

    private void addButtonClickListener() { 

     submit = (Button)findViewById(R.id.button); 
     submit.setOnClickListener(this); 
     submit2 = (Button)findViewById(R.id.button2); 
     submit2.setOnClickListener(this); 

    } 

    @Override 
    public void onClick(View view) { 
     float loanAmtValue = 0; 
     float roiValue = 0; 
     double answer=0; 
     float y = sb.getProgress(); 

     loanAmt = (EditText)findViewById(R.id.amt); 
     loanAmtValue = Float.parseFloat(loanAmt.getText().toString()); 
     roi = (EditText)findViewById(R.id.roi); 
     roiValue = Float.parseFloat(roi.getText().toString()); 

     if (loanAmtValue != null && roiValue != null){ 


       case R.id.button: 
        answer = (loanAmtValue * roiValue * y)/100; 

        siResult = (TextView) findViewById(R.id.result); 
        siResult.setText("Simple Interest for Amount Rs." + loanAmtValue + " and ROI " + roiValue + "% for "+y+" year(s) is = " + String.format("%.2f", answer)); 

        loanAmt.setText("0"); 
        roi.setText("0"); 
        break; 

      } 


     } 
     else 
     { 
      siResult.setText("Please provide valid details"); 
     } 
    } 
} 
+4

Как вы думаете, ' "Оператор! = Не может быть применен, чтобы плавать, нулевой"' означает? –

+2

Вы не можете сравнивать поплавки, поскольку они являются приматом, а не объектом! –

+0

@ Майкл Гольдштейн, можете ли вы показать мне, как это можно сделать в этом фрагменте кода? – user645

ответ

3

float примитивный тип данных, а не объект. null Проверка используется для объектов.

Для примитивов вы должны использовать проверку значений по умолчанию. Для float значение по умолчанию - 0.0f.

Читайте следующие:

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

http://www.c4learn.com/java/java-default-values/

0

Null используется для объектов. Если объект имеет значение NULL, это означает, что эта переменная не указана нигде.

Obj a = null // a points nowhere 
a = new Obj() // now a points to a place in the memory (a references an Obj object in the memory 

И плавать не является типом объекта, это примитивный тип. Но будьте осторожны, если вы сделаете сравнение, например: x == 0.0 (сравнение с плавающей точкой не похоже на целые числа сравнения!).

3

Похоже вашей проблемы здесь:

loanAmtValue = Float.parseFloat(loanAmt.getText().toString()); 

Эта линия будет бросать NumberFormatException если loanAmt не содержит строку, которая может быть преобразована в поплавок.

Вы можете проверить, что строка не пуста, прежде чем пытаться преобразовать плавать:

if (loanAmt.getText() != null && !loanAmt.getText().isEmpty()) { 
    loanAmtValue = Float.parseFloat(loanAmt.getText().toString()); 
} 

Это еще сгенерирует исключение, если пользователь вводит недопустимую строку, так что вы должны будете поймать исключение :

if (loanAmt.getText() != null && !loanAmt.getText().isEmpty()) { 
    try { 
     loanAmtValue = Float.parseFloat(loanAmt.getText().toString()); 
    catch (NumberFormatException ex) { 
     loanAmtValue = 0.0; // or some other default value 
    } 
} 
+1

Отличный ответ! Одна маленькая настройка, одна из моих любимых приложений для Android, заключается в использовании 'if (! TextUtils.isEmpty (loanAmt.getText())) вместо' if (loanAmt.getText()! = Null &&! LoanAmt.getText() .isEmpty()) ':) –

+0

@ScottW Это хорошая идея. Я менее знаком с классами утилиты Android, поэтому я не знал, что этот метод существует, хотя я не удивлен. – Eran

0

Чтобы ответить на все вопросы, вы не можете проверить, является ли поплавок нулевым, как и все здесь. Что вы можете сделать, так как «Der Golem» сказал, проверьте это, если это! = 0, если вы хотите убедиться, что значение не равно 0 (не то же самое, что и null !!!). BUT:

Чтобы предотвратить исключение NumberFormatException Вы также должны быть уверены, что ваше выхваченное значение из текстового поля редактирования является числом. Вы можете сделать это с Textutils:

android.text.TextUtils.isDigitsOnly(CharSequence str). 

В Вашем случае, Вы должны сделать это так:

loanAmt = (EditText)findViewById(R.id.amt); 

    String loanAmtString = loanAmt.getText().toString(); 
    if(android.text.TextUtils.isDigitsOnly(loanAmtString)){ 
    loanAmtValue = Float.parseFloat(loanAmtString); 
    } 

    roi = (EditText)findViewById(R.id.roi); 
    String roiString = roi.getText().toString(); 

    if(android.text.TextUtils.isDigitsOnly(roiString)){ 
    roiValue = Float.parseFloat(roiString); 
    } 
0

На мой взгляд, есть два пути для обеспечения соблюдения пользователю вводить только плавать значения.

  1. Использование inputType для EditText
  2. Проверка вводится текст с помощью регулярного выражения

    Pattern ptrn = Pattern.compile("^\\d*\\.\\d*$"); 
    String enteredText = ...; 
    
    if(ptrn.matcher(enteredText).matches()){ 
        // try to parse the string here 
    }