找不到bug

时间:2015-11-01 05:03:17

标签: android nullpointerexception

错误是:

java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{lol2dubs.stevemoa/lol2dubs.stevemoa.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.Window.findViewById(int)' on a null object reference

代码是:

public class MainActivity extends AppCompatActivity {
double MOA;
TextView turretClicks = (TextView)findViewById(R.id.turretClicks);
boolean noMOA;

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



    EditText range = (EditText) findViewById(R.id.rangeEntry);
    String stringRange = range.getText().toString();
    int finalRange = Integer.parseInt(stringRange);
    if(finalRange <= 200) {
        MOA = 0;
    }
    if(finalRange > 200 && finalRange <= 225){
        MOA = .5;
    }
    if(finalRange > 225 && finalRange <= 250) {
        MOA = 1;
    }
    if(finalRange > 250 && finalRange <= 275) {
        MOA = 1.65;
    }
    if(finalRange > 275 && finalRange <= 300) {
        MOA = 2.25;
    }
    if(finalRange > 300 && finalRange <= 325) {
        MOA = 2.8;
    }
    if(finalRange > 325 && finalRange <= 350) {
        MOA = 3.5;
    }
    if(finalRange > 350 && finalRange <= 375) {
        MOA = 4.0;
    }
    if(finalRange > 375 && finalRange <= 400) {
        MOA = 4.75;
    }
    if(finalRange > 400 && finalRange <= 425) {
        MOA = 5.50;
    }
    if(finalRange > 425 && finalRange <= 450) {
        MOA = 6.25;
    }
    if(finalRange > 450 && finalRange <= 475) {
        MOA = 7.0;
    }
    if(finalRange > 475 && finalRange <= 500) {
        MOA = 7.5;
    }
    if(finalRange > 500 && finalRange <= 525) {
        MOA = 8.25;
    }
    if(finalRange > 525 && finalRange <= 550) {
        MOA = 9.0;
    }
    if(finalRange > 550 && finalRange <= 575) {
        MOA = 9.75;
    }
    if(finalRange > 575 && finalRange <= 600) {
        MOA = 10.5;
    }
    if(finalRange > 600 && finalRange <= 625) {
        MOA = 11.5;
    }
    if(finalRange > 625 && finalRange <= 650) {
        MOA = 12.25;
    }
    if(finalRange > 650 && finalRange <= 675) {
        MOA = 13;
    }
    if(finalRange > 675 && finalRange <= 700) {
        MOA = 14;
    }
    if(finalRange > 700) {
       noMOA = true;
    }


    // Create an anonymous implementation of OnClickListener
    View.OnClickListener btnClickCalc = new View.OnClickListener() {


        public void onClick(View v) {
            double clicks = (MOA * 4);
            String toText = Double.toString(clicks);
            turretClicks.setText(toText);



        }
    };

        // Capture our button from layout
        Button button = (Button)findViewById(R.id.btnClickCalc);
        // Register the onClick listener with the implementation above
        button.setOnClickListener(btnClickCalc);

    }
}

基本上,我正在为我的岳父制作一个简单的应用程序,所以他不必在他的步枪炮塔上计算MOA。他的范围是四分之一MOA,所以如果他在550码处射门,他必须使用9 MOA,这是9组4次点击。

我有一个名为rangeEntry的输入范围EditText 我有一个名为btnClickCalc的按钮 我有一个名为turretClicks的TextView,它应该显示所述范围所需的点击次数。

我错过了什么错误?我看到这是因为某些东西是空的......我看到其他文章说他们没有实例化某些东西......但我没看到我的问题是什么。

任何?

XML是:

<?xml version="1.0" encoding="utf-8"?>

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Calculate MOA"
    android:id="@+id/textView"
    android:textColor="#ff0000"
    android:textSize="28dp"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true" />

<Button
    style="?android:attr/buttonStyleSmall"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Calculate Clicks"
    android:id="@+id/btnClickCalc"
    android:layout_centerVertical="true"
    android:layout_centerHorizontal="true"
    android:textColor="#ff0000"
    android:onClick="calcClick" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/turretClicks"
    android:textSize="28dp"
    android:textColor="#ff0000"
    android:hint="0"
    android:background="#ffffff"
    android:layout_below="@+id/btnClickCalc"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="74dp" />

<EditText
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:inputType="number"
    android:ems="10"
    android:id="@+id/rangeEntry"
    android:layout_marginTop="91dp"
    android:textSize="20dp"
    android:hint="Enter Range"
    android:background="#ffffff"
    android:layout_below="@+id/textView"
    android:layout_centerHorizontal="true" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Clicks"
    android:id="@+id/textView2"
    android:layout_below="@+id/turretClicks"
    android:layout_centerHorizontal="true"
    android:background="#ffffff"
    android:textColor="#fc0000"
    android:textSize="20dp" />

下面的解决方案修复了原始错误,但我现在得到了:

10-31 22:11:04.754 10019-10019/lol2dubs.stevemoa E/AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{lol2dubs.stevemoa/lol2dubs.stevemoa.MainActivity}: java.lang.NumberFormatException: Invalid int: ""

3 个答案:

答案 0 :(得分:5)

Textview之后将onCreate()定义移到setContentView()内。

像这样,

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

只有在设置ContentView后,您的活动才知道要解析哪个布局文件树以查找您指定的视图。

接下来,对stringRange Integer内部onClick事件进行onClick投射,并在NumberFormatException内投射后移动所有代码以避免@Override

另外,在onClick方法之前添加ShDocVw注释。

答案 1 :(得分:0)

将您的代码更改为这样,

TextView turretClicks; // changed here
boolean noMOA;

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

    turretClicks = (TextView)findViewById(R.id.turretClicks); // added the line here

    ---- and so on --

答案 2 :(得分:0)

您必须在setContentView(R.layout.activity_main);

之后定义视图

将其复制到您的项目中:

public class MainActivity extends AppCompatActivity {
double MOA;
TextView turretClicks;
boolean noMOA;

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

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

EditText range = (EditText) findViewById(R.id.rangeEntry);
String stringRange = range.getText().toString();
int finalRange = Integer.parseInt(stringRange);
if(finalRange <= 200) {
    MOA = 0;
}
if(finalRange > 200 && finalRange <= 225){
    MOA = .5;
}
if(finalRange > 225 && finalRange <= 250) {
    MOA = 1;
}
if(finalRange > 250 && finalRange <= 275) {
    MOA = 1.65;
}
if(finalRange > 275 && finalRange <= 300) {
    MOA = 2.25;
}
if(finalRange > 300 && finalRange <= 325) {
    MOA = 2.8;
}
if(finalRange > 325 && finalRange <= 350) {
    MOA = 3.5;
}
if(finalRange > 350 && finalRange <= 375) {
    MOA = 4.0;
}
if(finalRange > 375 && finalRange <= 400) {
    MOA = 4.75;
}
if(finalRange > 400 && finalRange <= 425) {
    MOA = 5.50;
}
if(finalRange > 425 && finalRange <= 450) {
    MOA = 6.25;
}
if(finalRange > 450 && finalRange <= 475) {
    MOA = 7.0;
}
if(finalRange > 475 && finalRange <= 500) {
    MOA = 7.5;
}
if(finalRange > 500 && finalRange <= 525) {
    MOA = 8.25;
}
if(finalRange > 525 && finalRange <= 550) {
    MOA = 9.0;
}
if(finalRange > 550 && finalRange <= 575) {
    MOA = 9.75;
}
if(finalRange > 575 && finalRange <= 600) {
    MOA = 10.5;
}
if(finalRange > 600 && finalRange <= 625) {
    MOA = 11.5;
}
if(finalRange > 625 && finalRange <= 650) {
    MOA = 12.25;
}
if(finalRange > 650 && finalRange <= 675) {
    MOA = 13;
}
if(finalRange > 675 && finalRange <= 700) {
    MOA = 14;
}
if(finalRange > 700) {
   noMOA = true;
}


// Create an anonymous implementation of OnClickListener
View.OnClickListener btnClickCalc = new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        double clicks = (MOA * 4);
        String toText = Double.toString(clicks);
        turretClicks.setText(toText);



    }
};

    // Capture our button from layout
    Button button = (Button)findViewById(R.id.btnClickCalc);
    // Register the onClick listener with the implementation above
    button.setOnClickListener(btnClickCalc);

}
}