2016-04-22 5 views
0

私はJavaコードでSQLステートメントを使用するだけでなく、LIKE演算子を検索に使用する必要がある学校の割り当てに取り組んでいます。私は、その後の形でこのクエリを返すJSPに渡されるSQLクエリのnullポインタ例外を返すJava

SELECT * FROM movies WHERE (movies.title LIKE '%userInput%');

:ために適切に私は、ユーザーから文字列を取得し、任意の区切り文字で文字列を分割して、そのようなクエリを実行する必要が検索します配列リスト。

今、私はそれをテストしていました。私はもともとユーザーの入力なしでそれをテストし、私のクエリはSELECT * FROM movies WHERE (movies.title LIKE '%%');になりました。これは私に正しい結果をもたらしました。

しかし、私はそこにtitleを入れたときに、突然のすべてが、私はこの行のNullPointerExceptionを得る:

if(title.equals("")) { return "(movies.title LIKE '%%') ";私のコードのこのセクションから:

public String getSearchString(String title) { 
    if(title.equals("")) { return "(movies.title LIKE '%%') "; } 
    String ret = "("; 
    ArrayList<String> titleArray = Util.splitSearch(title); 
    for(int i = 0; i < titleArray.size() - 1; ++i) { 
     String temp = titleArray.get(i); 
     String stmt = "movies.title LIKE '%" + temp + "%' OR "; 
     ret += stmt; 
    } 
    String temp = "movies.title LIKE '%" + titleArray.get(titleArray.size() - 1) + "%')"; 
    ret += temp; 
    return ret; 
} 

これはそのようにのように呼ばれています:

public List<Movie> listMovies(String title) throws SQLException { 
    List<Movie> search = new ArrayList<Movie>(); 
    if(null != title && title.isEmpty()) { title = ""; } 
    ResultSet res = queryMovies(getSearchString(title)); 
    while(res.next()) { 
     Movie mov = new Movie(); 
     mov.setTitle(res.getString("title")); 
     search.add(mov); 
    } 
    return search; 
} 

private static queryMovies(String st) throws SQLException { 
    ResultSet res = null; 
    try { 
     PreparedStatement ps = dbcon.prepareStatement(st); 
     res = ps.executeQuery(); 
    } catch(SQLException e) { 
     e.printStackTrace(); 
    } 
    return res; 
} 

残念ながら私はユーザーがどれくらい入力するか分からないので、これを行う必要があります。また、書式設定を容易にする外部ライブラリを使用することも許可されていません。参考のために私のUtil.splitSearch(...)メソッドはこのように見えます。英数字で何かを取り出すべきであると英数字ではないものに分割する必要があります。

public static ArrayList<String> splitSearch(String str) { 
    String[] strArray = str.split("[^a-zA-Z0-9']"); 
    return new ArrayList(Arrays.asList(strArray)); 
} 

興味深いのは、私は明示的getSearchString("");に渡すとき、私はNullPointerExceptionを取得しないです。変数titleの使用を許可するときだけです。そして、文字列が入力されていないときでも私はまだ1つを得る。

私は文字列を間違って分割していますか?私は何とかSQLに誤った記述をしていますか?私はこれについて非常に新しいので、どんな助けも高く評価されます。

答えて

0

inputから渡される "title"はnullです。したがって、title.equals( "")を実行するとnullpointerexceptionが発生します。

ベスト・プラクティスは、あなたが(ヌル!=タイトル& & title.equals( ""))のようなヌルチェックを行う示唆しています。 また、 ".equals(title)"を行うことができます

+0

私はこれを自分で実現しました。しかし、 'if(title.isEmpty()|| title == null || title.equals(" ")){title =" "; } '問題はまだ残っています.. – Alex

+0

nullチェックの前に操作を実行していても、nullpointerexceptionは' if(null!= title && title.isEmpty()){title = ""}} ' –

+0

あなたが言ったことを変更し、title.equals( "")が 'NullPointerException'を返すかどうかを確認します。どんな考え? – Alex

関連する問題