2015-02-26 3 views
0

Мой калькулятор простых интересов рушится с ошибкой исключения нулевого указателя, не уверен, в чем проблема, нет ошибок в IDE до того, как я усложню, это новое для меня. Вот мой код и LogCat: редактировать: Icouldn't разместить LogCat как редактор считает, что это код, и я не могу получить его в формат правильно Код:Сбой ошибки с ошибкой нулевого указателя

package com.codeherenow.sicalculator; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.EditText; 
import android.widget.TextView; 
import android.widget.SeekBar; 

public class SICalculatorActivity extends Activity 
    implements SeekBar.OnSeekBarChangeListener, View.OnClickListener{ 
private int years; 
private TextView YT; 
private SeekBar bar; 
private EditText principal = (EditText) findViewById(R.id.PA_field); 
private EditText interest = (EditText) findViewById(R.id.IR_field); 
public EditText pvalue; 
public EditText ivalue; 
private double mPvalue = 0; 
private double mIvalue = 0; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.sicalculator); 
    bar = (SeekBar)findViewById(R.id.seekBar); 
    bar.setOnSeekBarChangeListener(this); 
    pvalue = (EditText) principal.getText(); 
    ivalue = (EditText) interest.getText(); 
    String s = principal.getText().toString(); 
    mPvalue = Double.parseDouble(s); 
    String s2 = interest.getText().toString(); 
    mIvalue = Double.parseDouble(s2); 

} 
    @Override 
    public void onProgressChanged (SeekBar seekBar,int i, boolean b){ 
     years = i; 
     YT = (TextView) findViewById(R.id.Years); 
     YT.setText(years + " Year(s)"); 

    } 

    @Override 
    public void onStartTrackingTouch (SeekBar seekBar){ 

    } 

    @Override 
    public void onStopTrackingTouch (SeekBar seekBar){ 

    } 

@Override 
public void onClick(View view) { 
    TextView fTextView = (TextView) findViewById(R.id.finalText); 
    double finValue = mPvalue * (mIvalue/100) * years; 
    fTextView.setText("The interest for " + pvalue + "at a rate of " + ivalue + "for " + years + "year(s) is " + finValue); 
} 
} 
+0

Где находится ловушка? –

+3

NullPointerException - ошибка времени выполнения, поэтому она не будет отображаться при компиляции. Можете ли вы опубликовать трассировку стека, чтобы мы могли видеть, в какой строке она произошла? – childofsoong

+0

Я думаю, что проблема заключается в полях 'main' и' interest'. Я думаю, вам нужно вызвать 'findViewById' в' onCreate' после 'setContentView', а не там, где объявлены поля. –

ответ

2

Вы не можете создать экземпляр Переменные по телефону findViewById, когда вы их объявляете. Сначала вы должны объявить их, а затем создать экземпляр либо в onCreate, либо какой-либо метод, вызванный после того, как Activity привязана к представлению. Обязательно сделайте это после setContentView(R.layout.sicalculator);

Хорошо, увидев ваш макет, stacktrace и прочитав больше в вашем коде, я увидел, что есть фундаментальные проблемы, которые должны дать вам больше сбоев, поэтому давайте исправим их.

Во-первых, pvalue и ivalue переменные не нужны! Удалить их. Связанный: Вы не можете назначить Editable на номер EditText. Таким образом, эта строка недействительна ivalue = (EditText) interest.getText(); Поскольку getText() возвращает Editable. Но все это излишне и ненужно.

Во-вторых, в методе onCreate давайте просто инициализируем представления и не пытаемся получить значения и проанализировать их; пользователь (или вы) еще не взаимодействовал и не вводил никаких значений; поэтому попытка разобрать нулевые значения в Doubles приведет к краху вашего приложения. Ваш метод onCreate должен выглядеть примерно так. (Обратите внимание, что я также инициализирую вашу кнопку и устанавливаю здесь прослушиватель кликов).

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.sicalculator); 
    principal = (EditText) findViewById(R.id.PA_field); 
    interest = (EditText) findViewById(R.id.IR_field); 
    bar = (SeekBar) findViewById(R.id.seekBar); 
    bar.setOnSeekBarChangeListener(this); 
    calcBtn = (Button)findViewById(R.id.calc_btn); 
    calcBtn.setOnClickListener(this); 
} 

Теперь, вы должны получить значения и анализировать их в OnClick слушателя - только тогда, когда пользователь ввел значения и нажал на кнопку Calculate, так что ваш метод OnClick() должен выглядеть примерно так:

@Override 
public void onClick(View view) 
{ 
    TextView fTextView = (TextView) findViewById(R.id.finalText); 
    mPvalue = Double.valueOf(principal.getText().toString()); 
    mIvalue = Double.valueOf(interest.getText().toString()); 

    double finValue = mPvalue * (mIvalue/100) * years; 
    fTextView.setText("The interest for " + mPvalue + "at a rate of " + mIvalue + "for " + years + "year(s) is " + finValue); 
} 

И это должно очистить логику и порядок или объявление, инициализацию, извлечение значений из переменных для вас. Надеюсь, это объяснит, как работают Java и Android.

Ой, кстати, я действительно запустил код, и он работает на моем телефоне, так что это не просто с головы. Если это вам помогло, пожалуйста, примите ответ.

С наилучшими пожеланиями,

+0

Я исправил это, но он по-прежнему падает –

+0

Можете ли вы опубликовать трассировку стека Джошуа? Это действительно поможет нам помочь. – serkanozel

+0

@JoshuaPowers Нам нужно увидеть сообщение об ошибке. Вставьте все это и сообщите нам о линии, которая вызывает проблему. Кто-то отформатирует трассировку стека, если вы не можете этого сделать. –

Смежные вопросы