Исключение нулевого указателя метода Java HashMap get
у меня есть код, подобный следующему :-
class A
{
private HashMap<Character, Boolean> myMap;
public A()
{
myMap = new HashMap<Character, Boolean>();
String mychars = "asdfzxcvqwer";
for ( char c : mychars.toCharArray() )
myMap.put(c, true);
}
public doo(String input)
{
StringBuilder output = new StringBuilder();
for ( char c : input.toCharArray() )
{
if ( myMap.get(c) )
output.append(c);
}
}
...
...
}
Я получаю исключение нулевого указателя на строку if ( myMap.get(c) )
-- что я делаю не так?
7 ответов
если c
Не содержит myMap
, он вернется null
, который не может быть распакован как boolean
.
попробуй :
Boolean b = myMap.get(c);
if(b != null && b){
...
если myMap
не содержит ключа, который соответствует c
, потом myMap.get(c)
возвращают значение null. В этом случае, когда JVM распаковывает то, что он ожидает быть java.lang.Boolean
объект в boolean
примитив для выполнения условия, он находит нулевой объект и поэтому бросает java.lang.NullPointerException
.
следующий блок эквивалентен тому, что у вас есть в вашем примере, и должен облегчить понимание того, почему у вас будет NullPointerException
:
if (((Boolean) myMap.get(c)).booleanValue())
Я бы переписал ваш оригинал условие как:
if ( myMap.containsKey(c) )
надеюсь, это поможет.
если нет сущности с требуемым Character
в карте, то map.get(key)
возвращает null
и внутри if
заявление это приводит к NullPointerException
метания.
удар в темноте: есть ли запись на вашей карте для конкретного символа, назначенного c
? Если нет, Java может пытаться распаковать нулевое значение...
изменение этого
for ( char c : input.toCharArray() )
{
if ( myMap.get(c) )
output.append(c);
}
для этого
for ( char c : input.toCharArray() )
{
if ( myMap.containsKey(c) )
output.append(c);
}
будет использовать определенный метод Карты, чтобы проверить, зарегистрирован ли определенный ключ на карте. Я ухожу for
как есть, так как вы, похоже, хотите проверить группу ключей.
myMap.get(c)
возвращает значение, связанное с этим ключом, или null
если ключ не зарегистрирован.
в качестве примечания помните, что если вы используете этот метод с пользовательскими объектами, вам придется переопределить hashcode
и equals
методы.
предложение: я просто предлагаю это из отдаленной идеи, которую у меня есть, если это не правильная интерпретация вашего кода, просто игнорируйте его. Если ваша карта содержит только логическое значение, чтобы определить, содержится ли определенное значение "или нет", я настоятельно рекомендую вам использовать HashSet
вместо этого, потому что карта не делает никакого смысла в этом контексте.
ваш код очень грязный.
- сделать-это зарезервированное ключевое слово, не используйте его в качестве имени метода.
- выражение " if " должно возвращать логическое значение, а не null.
- инициализация myMap написана неправильно
вот рабочая версия :
import java.util.HashMap;
public class A {
private HashMap<Character, Boolean> myMap;
public A() {
this.myMap = new HashMap<Character, Boolean>();
String mychars = "asdfzxcvqwer";
for ( char c : mychars.toCharArray() )
myMap.put(c, true);
}
public String execute(String input) {
StringBuilder output = new StringBuilder();
for ( char c : input.toCharArray() )
{
if ( this.myMap.get(c) != null )
output.append(c);
}
return output.toString();
}
public static void main(String[] args) {
A test = new A();
test.execute("abc");
}
}