为什么我的Java程序只返回ArrayList中的最后一个字符串

为什么我的Java程序只返回ArrayList中的最后一个字符串,java,Java,我希望Java程序根据if/else条件返回字符串响应,但它只响应ArrayList中的最后一个元素。 我已经为此工作了两天,但没有成功。 我希望你能告诉我我做错了什么。多谢各位 import java.io.IOException; import java.util.logging.Logger; public class ScanUtility implements IScanUtility { Logger logger = Logger.getLogger("ScanUti

我希望Java程序根据if/else条件返回字符串响应,但它只响应ArrayList中的最后一个元素。 我已经为此工作了两天,但没有成功。 我希望你能告诉我我做错了什么。多谢各位

import java.io.IOException;
import java.util.logging.Logger;

public class ScanUtility implements IScanUtility { 

    Logger logger = Logger.getLogger("ScanUtility"); 


    private  String performHostScan(String nodeName) {   

         Process OSCmdProcess = null; 
         Integer exitValue = null;
         String OScmd = null;
         String exitMessage = null;

        String OScmd = new String("/usr/bin/ssh ansible@" + nodeName + " " + "/tmp/openscapscan.bash rheldisa"); 

        try {
            OSCmdProcess = Runtime.getRuntime().exec(OScmd);
             exitValue = OSCmdProcess.waitFor(); 
            if (exitValue.equals(0)) {  

                exitMessage = ("Succeeded on" + " " + nodeName);
                return exitMessage; 
              } else {
                  exitMessage =  ("Failed on" + " " + nodeName);
                return exitMessage;
            }
        } catch (IOException ioExcep) {
            ioExcep.printStackTrace();
        } catch (InterruptedException interExcep) {
            interExcep.printStackTrace();
        }
        return exitMessage;

    }  



       //This method takes an ArrayList of hosts from the servlet controller
      // and passes the list to the ScanUtility Method above
      //============================================================
     public String generateHostName(List<String>  addressList){  
           String statusMessage = null;
          for(String nodeName: addressList){         
              statusMessage =  new ScanUtility().performHostScan(nodeName);
          }
        return statusMessage;                 
      }
}
import java.io.IOException;
导入java.util.logging.Logger;
公共类ScanUtility实现IScanUtility{
Logger=Logger.getLogger(“scanputility”);
私有字符串performHostScan(字符串节点名){
进程OSCmdProcess=null;
整数exitValue=null;
字符串OScmd=null;
字符串exitMessage=null;
String OScmd=new字符串(“/usr/bin/ssh ansible@”+nodeName++”/tmp/openscapscan.bash rheldisa”);
试一试{
OSCmdProcess=Runtime.getRuntime().exec(OScmd);
exitValue=OSCmdProcess.waitFor();
如果(exitValue.equals(0)){
exitMessage=(“+”+nodeName上成功);
返回现有消息;
}否则{
exitMessage=(“+”+nodeName上失败);
返回现有消息;
}
}捕获(IOException IOEXEP){
ioexep.printStackTrace();
}捕获(中断异常中断){
interexep.printStackTrace();
}
返回现有消息;
}  
//此方法从servlet控制器获取主机的ArrayList
//并将列表传递给上面的scanputility方法
//============================================================
公共字符串generateHostName(列表地址列表){
字符串statusMessage=null;
对于(字符串节点名:地址列表){
statusMessage=new ScanUtility().performHostScan(节点名称);
}
返回状态信息;
}
}

问题在于,在循环的每次迭代中,您都会覆盖
statusMessage
。我相信您要做的是将所有字符串放入
ArrayList

public ArrayList generateHostName(列表地址列表){
ArrayList statusMessage=新建ArrayList();
对于(字符串节点名:地址列表){
statusMessage.add(new scanputility().performHostScan(nodeName));
}
返回状态信息;
}

显然,您希望返回状态消息列表(您正在扫描的每个服务器的状态消息)

公共列表GetResponseFromAddresses(列表地址){
final ScanUtility ScanUtility=新的ScanUtility();
返回地址。stream()
.map(scanUtility::performHostScan)
.collect(Collectors.toList());
}
方法名称有误导性。我已将其更改为
GetResponseFromAddresses
——这就是该方法的实际功能。

尝试以下操作:

  public List<String> generateHostName(List<String>  addressList){  
      List<String> statusMessages = new ArrayList<>();
      for(String nodeName: addressList){         
          statusMessages.add(new ScanUtility().performHostScan(nodeName));
      }
      return statusMessages;                 
  }
公共列表generateHostName(列表地址列表){
List statusMessages=new ArrayList();
对于(字符串节点名:地址列表){
statusMessages.add(new scanputility().performHostScan(nodeName));
}
返回状态信息;
}

您正在覆盖for循环中每个步骤中的
statusMessage
。可能您希望为(字符串nodeName:addressList){statusMessage=new canUtility().performHostScan(nodeName);}返回一个
列表,而不是一个字符串
深入了解这一部分。另外,很难理解
performHostScan
中的逻辑如何影响从
generateHostName
返回的内容。您可能希望更改该方法的返回类型,以便您的代码compiles@JoakimDanielson谢谢你指出这一点!代码编译后,只返回最后一个扫描元素的消息。非常感谢!!。你们太棒了!它成功了:漏洞扫描在eagle上成功漏洞扫描在falcon上成功漏洞扫描在hawk上成功漏洞扫描在owl上成功漏洞扫描在ospreyIt上成功!成功了!。感谢您在eagle上成功进行了一百万次漏洞扫描在falcon上成功了漏洞扫描在hawk上成功了漏洞扫描在owl上成功了漏洞扫描在osprey上成功了
public List<String> getResponsesFromAddresses(List<String> addresses) {
    final ScanUtility scanUtility = new ScanUtility();

    return addresses.stream()
                     .map(scanUtility::performHostScan)
                     .collect(Collectors.toList());
}
  public List<String> generateHostName(List<String>  addressList){  
      List<String> statusMessages = new ArrayList<>();
      for(String nodeName: addressList){         
          statusMessages.add(new ScanUtility().performHostScan(nodeName));
      }
      return statusMessages;                 
  }