空指针异常 Java

编程入门 行业动态 更新时间:2024-10-27 16:24:18
本文介绍了空指针异常 Java的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我刚刚开始学习 Java,遇到了一个问题.尝试运行 Android 应用程序时,调用 makeResponse 方法时出现 NullPointerException.

I'm just starting out with learning Java, and have run into a problem. When trying to run an Android application, I get a NullPointerException when the method makeResponse is called.

代码摘录(本文末尾附有完整代码):

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是父类的一个字段,在另一个方法中设置.sw是一个自制类的实例——完整代码在最后)

(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)

在以int id ="

The exception is thrown at the line beginning "int id ="

我对 NullPointerException 的最初搜索告诉我,它是在需要对象的情况下应用程序尝试使用 null 时抛出的".- 因此,我上面代码中的两个if"子句,试图找出哪个对象意外为空.由于这些都不是,我得出结论 sw.getIdFromName 必须返回一个 Integer 类型的空值(如在这个类似的问题中:Java:拆箱整数时出现空指针异常?).但是,我在 sw.getIdFromName 中看不到这是如何实现的,如下所示(nameLookup 是一个字符串数组,sw 的一个字段):

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." - hence the two "if" clauses in my code above, to try to find which object was unexpectedly 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?). However, I don't see how this is possible in sw.getIdFromName as shown below (nameLookup is a String array, a field of sw):

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

(顺便说一句,如果有更好的方法来搜索字符串数组中的搜索词,如果有人能告诉我,我将不胜感激 - binarySearch 似乎没有在字符串数组上定义).

(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).

按照上面链接的问题中最高评论者的建议,我尝试在 makeResponse 中将int id"替换为Integer id",但没有效果 - 在同一个地方抛出了相同的异常.

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.

如有任何建议,我们将不胜感激.

Any advice would be gratefully appreciated.

从上面链接的 stackoverflow 问题中的评论来看,提供堆栈跟踪不会提供任何新信息,但如果被问到,我很乐意这样做.

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.

附言这是我在这里的第一个问题,如果我犯了一些违反礼仪或愚蠢的错误,我深表歉意.

P.s. this is my first question here, so apologies if I make some breach of etiquette or inane mistake.

完整代码清单:

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; } }

StationWrapper.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(""); } } }

推荐答案

如果不运行您的代码,nameLookup 数组条目之一似乎很可能是 null,所以试图调用 nameLookup[i].equals() 会抛出一个 NullPointerException.

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,一种处理方法是颠倒 getIdFromName() 中的比较顺序:

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

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

无论如何,我建议您确保 nameLookup 本身及其元素都已完全初始化.

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

更多推荐

空指针异常 Java

本文发布于:2023-08-02 17:49:50,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1279861.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:指针   异常   Java

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!