2

nullPointerゲッターメソッドで問題があります。

コードは次のとおりです。

 public String getTitle()
  {
    if(!title.isEmpty())
        return title;
    else 
        return "foo";
  }

これを通常のゲッターに変更すると、完全に機能します。

public String getTitle()
  {
    return title;
  }

トリックはどこにありますか?反射のトリックはありますか?

UPDATE問題はnullチェックではなく、getterを呼び出さずに実行することです

スタックトレース

org.codehaus.jackson.map.JsonMappingException: (was java.lang.NullPointerException) (through reference chain: java.util.ArrayList[0]- >si.mikropis.webkiosk.model.vao.wine.Wine["title"])

Caused by: java.lang.NullPointerException at si.mikropis.webkiosk.model.vao.base.BaseModel.getTitle(BaseModel.java:41) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.codehaus.jackson.map.ser.BeanPropertyWriter.get(BeanPropertyWriter.java:483) at org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:418) at org.codehaus.jackson.map.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:150) ... 32 more

4

9 に答える 9

10

title同様に nullかどうかを確認します。

  public String getTitle()
  {
    if(title != null && !title.isEmpty())
        return title;
    else 
        return "foo";
  }

ps 更新された問題ごとの追加コメント: JSON パーサーはオブジェクトのすべてのメンバーを実行する必要があるため、簡単な方法がない可能性があります。私が考えることができる唯一の解決策は、Jacksonにnull値を含めないように指示するか、カスタムマッパーを実装することです。パフォーマンスが主な懸念事項である場合は、ライブラリが非常に高速で、Jackson よりもメモリ消費が少ないため、 google-gsonを使用します。

于 2013-08-21T09:21:39.130 に答える
3

特にあなたのコメントに注意してください。ゲッターを呼び出していません。多くのフレームワークはJavaBean 規則を使用しており、プロパティを指定するtitleと、フレームワークは を呼び出します getTitle()

たとえば、Spring の場合 (Springを使用しているとは限りません):

<property name="title" value="abc"/>

セッターを暗黙的に呼び出します。

したがって、何らかの反省が行われていることを示唆するのは正しいことです。title プロパティをどこかで参照していて、使用中のフレームワークがゲッターを暗黙的に呼び出していると思われます。前述のように、ゲッターに NPE の可能性があります。ブレークポイントは、それがどのように呼び出されているかを正確に教えてくれます。または、実際には、例外スタックトレースです。

編集:スタックトレースに注意してください。特に:

org.codehaus.jackson.map.ser.BeanPropertyWriter.get(BeanPropertyWriter.java:483)

これは、そのような反射が使用されていることを示唆しています。

于 2013-08-21T09:21:50.063 に答える
2

ここの行で

  if(!title.isEmpty())

titleですnull

チェックを追加してくださいnull。しかし、getter でチェックインするのは得策ではありません。代わりは

String title  ="foo"

public String getTitle()
  {
    return title;
  }

public String setTitle(String title)
    {
    this.title = title;
    }
于 2013-08-21T09:22:05.673 に答える
1

これらの null/empty チェックを頻繁に行う場合は、Commons Langを含める価値があるかもしれません。

 return StringUtils.defaultIfBlank(title, "foo");

Null セーフで、Unicode の空白を処理します。

于 2013-08-21T09:23:52.503 に答える
1
 if(!title.isEmpty())

null かどうかを確認せずに、タイトルに対して直接操作を実行しています。最初に NPE チェックを行う必要があります

if(title != null) {
if(!title.isEmpty())
    return title;
 } 
 return "foo";
于 2013-08-21T09:24:39.640 に答える
0

タイトルは かもしれませんnull

public String getTitle() {
    if(title !=null && !title.isEmpty())
        return title;
    else 
        return "foo";
}
于 2013-08-21T09:24:18.910 に答える
0

あるいは、タイトルを次のように定義することもできます。

于 2013-08-21T09:26:39.397 に答える
0

個人的には、ここで三項演算を使用します

public String getTitle() {
   return (title !=null && !title.isEmpty()) ? title : "foo";
}

それとは別に、他のすべての答えはあなたが欲しいと言うでしょう。

于 2013-08-21T09:30:36.197 に答える