迭代列表

时间:2015-04-24 16:25:55

标签: java nullpointerexception

我有一个User对象的ArrayList。

private ArrayList<User> users;

这是包含数组列表&#34; users&#34;的类的构造函数。 :

public CommunicationThread(Socket socket, ArrayList<User> users) {
    super("CommunicationThread");

    try {
        // Initialize data fields 
        this.users = users;

        System.out.println("Client connected : " + client_socket.getInetAddress().toString());
    } catch(IOException e) {
        System.out.println("Could not initialize communication properly. -- CommunicationThread.\n");
        e.printStackTrace(client_out); // Also inform the client.
    }
}

我写了一个程序&#34; search_user&#34;它会搜索给定用户名的用户。

private User search_user(String username) {
    for(int i = 0; i < this.users.size(); i++) {
        User found_user = this.users.get(i);
        if(found_user.username.equals(username))
            return found_user;
    }       
    return new UserNotFound();
}

当我试图搜索用户时,它总是给我一个nullpointer异常。

Exception in thread "CommunicationThread"
java.lang.NullPointerException
    at DirectoryService.CommunicationThread.search_user(CommunicationThread.java:92)

&#34;用户&#34;我在搜索时列表为空,但这应该只返回一个新的&#34; UserNotFound&#34;对象并不应该抛出nullpointer异常。

4 个答案:

答案 0 :(得分:0)

简单地执行空检查并立即返回“UserNotFound”。

提示:编写一个日志语句来检查列表对象的空状态。

private User search_user(String username) {
    if(this.users == null || this.users.size() == 0){
        return new UserNotFound();
    }
    for(int i = 0; i < this.users.size(); i++) {
        User found_user = this.users.get(i);
        if(found_user.username.equals(username))
            return found_user;
    }       
    return new UserNotFound();
}

这是一个非常简单的修复方法。尝试调试代码。

答案 1 :(得分:0)

当您搜索不存在的用户时会返回

\Events::addListener('on_before_dispatch', function() { $request = \Request::getInstance(); $page = \Page::getByPath($request->getPath()); // Get the real requested page if ($page->isError()) { // If it doesn't exist $path = new \Concrete\Core\Url\Components\Path($request->getPath()); $path = $path->prepend('en'); // prepend "/en" to the path, ex: "/path/to" becomes "/en/path/to" $page = Page::getByPath($path); if (!$page->isError) { // Make sure that this page actually exists // This may not work, you might need to replace the actual \Request instance. $request->setCurrentPage($page); // Set it to the requested page. } } }); ,但您正在执行的是对未初始化列表的分配(在您调用“搜索”之前发生)。

搜索调用UserNotFound构造函数的代码,并看到您将CommunicationThread值传递为null

解决方案:声明ArrayList<User> users时将其初始化为空列表。

答案 2 :(得分:0)

您应首先检查用户是否为空:

private ArrayList<User> users;

答案 3 :(得分:0)

您似乎正在使用其他构造函数来创建.directive('pictures', function () { return { restrict: 'EA', link: function (scope, element, attrs) { var url = attrs.pictures; element.css({ 'background-image': 'url("' + url +'")', <-- Change here 'background-size' : 'cover' }); } }; }); 的对象。而是做无用的CommunicationThread检查并使你的代码变得丑陋,我建议在声明字段时初始化你的列表:

null