会话setAttribute抛出空指针

时间:2016-11-17 20:59:19

标签: java session

我正在编写Java代码,如果输入国家/地区名称,会话应将属性设置为相应的国家/地区代码,否则不应保存会话。

以下是我的代码

临时班级

package onlyJava;

import java.util.Locale;
import java.util.Scanner;

import com.amazon.speech.speechlet.Session;

public class Temp {

    String cityName;

    public void getTheCurrentWeather(Session session) {
        System.out.println("Enter a city Name\n");
        Scanner sc = new Scanner(System.in);
        cityName = sc.next();
        getCountryCode(cityName, session);
        System.out.println(session.getAttribute("cCode").toString());
    }

    public String getCountryCode(String countryName, Session session) {
        System.out.println(countryName + "\t" + session);
        String result = "";
        String[] locales = Locale.getISOCountries();

        for (String countryCode : locales) {

            Locale obj = new Locale("", countryCode);
            if (countryName.equals(obj.getDisplayCountry().toString())) {
                result = obj.getCountry();
                session.setAttribute("cCode", result);
            }
        }

        return result;
    }

}

测试类 (主要)

package onlyJava;

import com.amazon.speech.speechlet.Session;

public class Test {

    public static void main(String[] args) {

        Temp temp = new Temp();
        temp.getTheCurrentWeather(null);

    }

}

当我使用输入印度 国家运行此代码时,我得到以下结果。

India   null
Exception in thread "main" java.lang.NullPointerException
    at onlyJava.Temp.getCountryCode(Temp.java:30)
    at onlyJava.Temp.getTheCurrentWeather(Temp.java:16)
    at onlyJava.Test.main(Test.java:10)

当我输入 Hyderabad City 时,我得到以下结果。

Hyderabad   null
Exception in thread "main" java.lang.NullPointerException
    at onlyJava.Temp.getTheCurrentWeather(Temp.java:17)
    at onlyJava.Test.main(Test.java:10)

请让我知道我哪里出错了,我该怎么办呢。

由于

1 个答案:

答案 0 :(得分:0)

在这两种情况下都会抛出NPE,因为你在从main函数调用getWeather方法时给出了一个null作为参数。

主类期望接收非空的Session实例,并且永远不会检查它是否为null。

India测试用例中,从getCountry()方法抛出NullPointerException,因为India实际上是一个有效的国家/地区,因此该方法会尝试在会话对象中记下它的相应国家/地区代码。就在它落入NPE的那一刻。

在第二种情况下,由于Hyderabad不是国家/地区,因此会话中不会写入任何内容,并且在尝试从空会话实例恢复会话属性时会抛出NPE。

如果在测试类的主方法中传递有效的Session实例

,则两个错误都将得到修复