[英]Null Pointer Exception Java
I'm just starting out with learning Java, and have run into a problem. 我刚刚开始学习Java,并遇到了一个问题。 When trying to run an Android application, I get a NullPointerException when the method makeResponse is called.
尝试运行Android应用程序时,调用方法makeResponse时会出现NullPointerException。
Code extract (full code appended at the end of this post): 代码提取(本帖末尾附有完整代码):
private String makeResponse(String input){
//This doesn't work yet. I keep getting null pointer exceptions on the line beginning "int id" line, but can't tell why.
String response = "You picked "+input;
if (sw==null){
response+=" and sw is null"; //This doesn't activate
}
if (input==null){
response+=" and input is null"; //This doesn't activate
}
int id = sw.getIdFromName(input); //If this line (and the following one) are commented out, the method runs with no problem, but neither of the if clauses above trigger.
response+=", that has id "+String.valueOf(id);
return response;
}
(sw is a field of the parent class, set in another method. sw is an instance of a self-made class - full code at the end) (sw是父类的一个字段,在另一个方法中设置.sw是一个自制类的实例 - 最后的完整代码)
The exception is thrown at the line beginning "int id =" 从“int id =”开始的行抛出异常
My initial searching for NullPointerException told me that it was "thrown when an application attempts to use null in a case where an object is required." 我最初搜索NullPointerException告诉我,当应用程序在需要对象的情况下尝试使用null时,它会“抛出”。 - hence the two "if" clauses in my code above, to try to find which object was unexpectedly null.
- 因此我上面的代码中的两个“if”子句,试图找到哪个对象意外为null。 Since neither of these are, I concluded that sw.getIdFromName must be returning a null of type Integer (as in this similar problem: Java: null pointer exception when unboxing Integer? ).
由于这两者都不是,我得出结论,sw.getIdFromName必须返回一个Integer类型的null(就像在这个类似的问题中: Java:取消装箱整数时的空指针异常? )。 However, I don't see how this is possible in sw.getIdFromName as shown below (nameLookup is a String array, a field of sw):
但是,我没有看到如何在sw.getIdFromName中实现这一点,如下所示(nameLookup是一个String数组,一个sw字段):
public int getIdFromName(String name){
for (int i=0;i<267;i++){
if (nameLookup[i].equals(name)){
return i;
}
}
return -1;
}
(Incidentally, if there is a better way of searching a String array for a search term, I would be grateful if someone could tell me - binarySearch doesn't appear to be defined on String arrays). (顺便说一下,如果有一种更好的方法来搜索字符串数组中的搜索词,我会很高兴有人能告诉我 - binarySearch似乎没有在字符串数组中定义)。
Following the advice of the top commenter in the question linked above, I tried replacing "int id" with "Integer id" in makeResponse, but with no effect - the same exception is thrown at the same place. 根据上面链接的问题中的顶级评论者的建议,我尝试在makeResponse中用“Integer id”替换“int id”,但没有效果 - 在同一个地方抛出相同的异常。
Any advice would be gratefully appreciated. 任何建议将不胜感激。
Judging from the comments in the stackoverflow question linked above, providing a stack trace would not provide any new information, but I'd be happy to do so if asked. 从上面链接的stackoverflow问题中的注释来看,提供堆栈跟踪不会提供任何新信息,但如果被问到,我会很乐意这样做。
Ps this is my first question here, so apologies if I make some breach of etiquette or inane mistake. Ps这是我在这里的第一个问题,如果我犯了礼仪或者错误的话,请道歉。
Full code listings: 完整代码清单:
ConversationActivity.java: ConversationActivity.java:
package com.example.Conversation;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.TextView;
public class ConversationActivity extends Activity {
/** Called when the activity is first created. */
StationsWrapper sw;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
/**Setting the adapter for the AutoComplete*/
final AutoCompleteTextView textView = (AutoCompleteTextView) findViewById(R.id.ACTextView1);
String[] stationsArray = getResources().getStringArray(R.array.stations);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.list_item, stationsArray);
textView.setAdapter(adapter);
/**Code below grabs the data from stations.xml and puts it in a readable object */
this.sw = new StationsWrapper();
/** Code below is to set a click function for the AutoComplete*/
OnItemClickListener ACListener = new OnItemClickListener(){
public void onItemClick(AdapterView<?> parent, View v, int position,
long id) {
TextView reply = (TextView) findViewById(R.id.reply);
reply.setText("working...");
String ChosenStation = (String) parent.getItemAtPosition(position);
reply.setText(makeResponse(ChosenStation));
//Toast.makeText(ConversationActivity.this, "You clicked "+parent.getItemAtPosition(position), Toast.LENGTH_SHORT).show();
textView.setText("");
}
};
textView.setOnItemClickListener(ACListener);
}
private String makeResponse(String input){
//This doesn't work yet. I keep getting null pointer exceptions on the line beginning "int id" line, but can't tell why.
String response = "You picked "+input;
if (sw==null){
response+=" and sw is null"; //This doesn't activate
}
if (input==null){
response+=" and input is null"; //This doesn't activate
}
int id = sw.getIdFromName(input); //If this line (and the following one) are commented out, the method runs with no problem, but neither of the if clauses above trigger.
response+=", that has id "+String.valueOf(id);
return response;
}
}
StationsWrapper.java: StationsWrapper.java:
package com.example.Conversation;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class StationsWrapper {
private int[][] stats;
private String[] nameLookup;
public StationsWrapper(){
//Constructor. Grabs data from XML, and whacks it into relevant arrays.
//stats is an integer array, indexed first by station id (1-267), and then by datatype (0 for line, 1 for zone)
final int[][] stats = new int[267][2];
final String[] nameLookup = new String[267];
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
DefaultHandler handler = new DefaultHandler() {
boolean bline = false;
boolean bzone= false;
String curStation;
int curID;
String curLine;
String curZone;
public void startElement(String uri, String localName,String qName,
Attributes attributes) throws SAXException {
if (qName.equalsIgnoreCase("STATION")){
curStation=attributes.getValue(0);
curID=Integer.parseInt(attributes.getValue(1));
}
if (qName.equalsIgnoreCase("LINE")) {
bline = true;
}
if (qName.equalsIgnoreCase("ZONE")) {
bzone = true;
}
}
public void endElement(String uri, String localName,
String qName) throws SAXException {
if (qName.equalsIgnoreCase("Station")){
nameLookup[curID-1]=curStation;
int intLine=(convLineToInt(curLine));
stats[curID-1][0]=intLine;
int intZone=(convZoneToInt(curZone));
stats[curID-1][1]=intZone;
}
}
public void characters(char ch[], int start, int length) throws SAXException {
if (bline) {
//System.out.println("Line : " + new String(ch, start, length));
curLine=new String(ch, start, length);
bline = false;
}
if (bzone) {
//System.out.println("Zone : " + new String(ch, start, length));
curZone=new String(ch, start, length);
bzone = false;
}
}
};
saxParser.parse("c:\\Users\\Jack Jackson\\Coding\\Java\\stations.xml", handler);
} catch (Exception e) {
e.printStackTrace();
}
this.stats=stats;
this.nameLookup=nameLookup;
}
public static void main(String[] args){
//Nothing to see here, move it along folks.
}
public String[] getNameLookup(){
return nameLookup;
}
public int getIdFromName(String name){
for (int i=0;i<nameLookup.length;i++){
if (nameLookup[i].equals(name)){
return i;
}
}
return -1;
}
public int returnData(int id, int datapoint){
return stats[id][datapoint];
}
public void displayStats(){
for (int i=0;i<267;i++){
for (int j=0;j<2;j++){
System.out.print(stats[i][j]);
System.out.print(" ");
}
System.out.println("");
}
}
}
Without running your code, it seems very likely that one of nameLookup
array entries is null
, so trying to call nameLookup[i].equals()
throws a NullPointerException
. 在不运行代码的情况下,
nameLookup
数组之一似乎很可能为null
,因此尝试调用nameLookup[i].equals()
会抛出NullPointerException
。
If elements of nameLookup
can legitimately be null
, one way to handle this is to reverse the order of the comparison in getIdFromName()
: 如果
nameLookup
元素可以合法地为null
,则处理此问题的一种方法是在getIdFromName()
反转比较的顺序:
if (name.equals(nameLookup[i])) {
In any case, I'd recommend that you make sure that both nameLookup
itself and its elements are fully initialized. 无论如何,我建议您确保
nameLookup
本身及其元素都已完全初始化。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.