Java exclusive pointer exception

I am just starting to learn Java and am facing a problem. When I try to run an Android application, I get a NullPointerException when calling the makeResponse method.

Code output (full code added 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 the field of the parent class specified in another way. sw is the instance of the self-made class - the full code at the end)

An exception is thrown at the beginning of the line "int id ="

My initial search for a NullPointerException told me that it was "thrown when an application tries to use null in case an object is required." - therefore, the two "if" sentences in my code above to try and find which object was unexpectedly null. Since neither one nor the other, I came to the conclusion that sw.getIdFromName should return an integer type zero (as in this similar problem: Java: null pointer exception when unpacking Integer? ). However, I do not see how this is possible in sw.getIdFromName, as shown below (nameLookup is an array of String, field sw):

 public int getIdFromName(String name){ for (int i=0;i<267;i++){ if (nameLookup[i].equals(name)){ return i; } } return -1; } 

(By the way, if there is a better way to search for a String array for a search query, I would appreciate it if someone could tell me: binarySearch is not defined for String arrays).

Following the recommendations of the main commentator in the question above, I tried to replace "int id" with "Integer id" in makeResponse, but without effect - the same exception throws in the same place.

Any advice would be greatly appreciated.

Judging by the comments in the stackoverflow question above, providing a stack trace will not provide any new information, but I would be happy to do so if asked.

Ps is my first question here, so I apologize if I commit some kind of breach of etiquette or a mistake.

Full list of codes:

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:

 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(""); } } } 
+4
source share
1 answer

Without running the code, it seems very likely that one of the entries in the nameLookup array is null , so trying to call nameLookup[i].equals() throws a NullPointerException .

If nameLookup elements can be legal null , one way to handle this is to change the comparison order in getIdFromName() :

 if (name.equals(nameLookup[i])) { 

In any case, I recommend that you make sure that both nameLookup and its elements are fully initialized.

+5
source

Source: https://habr.com/ru/post/1380730/


All Articles