【问题标题】:Getting ArrayIndexOutOfBound : 1 exception获取 ArrayIndexOutOfBound : 1 异常
【发布时间】:2013-10-24 22:55:36
【问题描述】:

我正在尝试解析一个字符串并将其存储在一个字符串数组中。当我试图解析字符串“log1”时,我能够解析它。 但是当我解析字符串“log2”时,得到这个“线程中的异常”main“java.lang.ArrayIndexOutOfBoundsException:1”。

运行以下代码:

import static java.lang.System.*;

public class test{


    static String[] final_log = new String[13];
    static String audit = null;
    static String[] auditArray = null;
    static int j=0;

    public static void main(String[] args) {



    String[] columnlist = {"UserID","ClientAddress","Severity","EventType","ResourceAccessed","EventStatus","CompulsoryEvent","AuditCategory","ComponentID","AuditDetails","App ID","Cluster ID","Node ID"};

    String log1 = "UserID : ccmadministrator  ClientAddress : 172.30.235.29  Severity : 5  EventType : GeneralConfigurationUpdate  ResourceAccessed: CUCMAdmin  EventStatus : Success  CompulsoryEvent : No  AuditCategory : AdministrativeEvent  ComponentID : Cisco CUCM Administration  AuditDetails :  record in table batjob with key field name = Export Configuration, Job id : 1380812040 added  App ID: Cisco Tomcat Cluster ID:  Node ID: iptapps-eft-cucm1" ;


    String log2 = "09:03:36.776 |LogMessage   UserID : ccmadministrator  ClientAddress : 172.30.238.14  Severity : 6  EventType : GeneralConfigurationUpdate  ResourceAccessed: Cisco CCM Serviceability RTMT  EventStatus : Success  CompulsoryEvent : No  AuditCategory : AdministrativeEvent  ComponentID : Cisco CCM Serviceability RTMT  AuditDetails : Alert status changed to Enable for the alert: Cisco Syslog Agent:SYSAGENT:SyslogSeverityMatchFound App ID: Cisco Tomcat Cluster ID:  Node ID: iptapps-eft-cucm1";

    auditArray = log2.split("UserID");
    System.out.println("count :" +j);
    audit = auditArray[1];

    for (int i = 1; i < columnlist.length; i++) {
        auditArray = audit.split(columnlist[i]);
        balle();
    }


    final_log[j]= audit.trim().substring(1).trim();

    for (int i = 0; i < final_log.length; i++) {
        System.out.println("test : " +final_log[i]);
    }



    }

    public static void balle(){
        final_log[j] = auditArray[0].trim().substring(1).trim();
        audit = auditArray[1];
        System.out.println(final_log[j]);
        j++;
    }

}

log1 的控制台输出是 ::

count :0
ccmadministrator
172.30.235.29
5
GeneralConfigurationUpdate
CUCMAdmin
Success
No
AdministrativeEvent
Cisco CUCM Administration
record in table batjob with key field name = Export Configuration, Job id : 1380812040 added
Cisco Tomcat

test : ccmadministrator
test : 172.30.235.29
test : 5
test : GeneralConfigurationUpdate
test : CUCMAdmin
test : Success
test : No
test : AdministrativeEvent
test : Cisco CUCM Administration
test : record in table batjob with key field name = Export Configuration, Job id : 1380812040 added
test : Cisco Tomcat
test : 
test : iptapps-eft-cucm1

log2 的控制台输出是 ::

count :0
ccmadministrator
172.30.238.14
6
GeneralConfigurationUpdate
Cisco CCM Serviceability RTMT
Success
No
AdministrativeEvent
Cisco CCM Serviceability RTMT
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
    at test.balle(test.java:43)
    at test.main(test.java:27)

来自 OP 的评论

Line 43 is :: audit = auditArray[1]; {present in balle method}     

【问题讨论】:

  • 您的 test.java 文件中的第 43 行究竟是什么?
  • 1 不是audit = auditArray[1]; 中的有效索引,可能
  • 对每个数组执行一个 for 循环,打印出每个元素。希望这会让您看到某些地方没有按预期工作。
  • 它将是以下几行之一:final_log[j] = auditArray[0].trim().substring(1).trim();audit = auditArray[1]; 不知道哪一行是数字 43,很难说。尝试在balle() 的开头打印出auditArray,看看你在处理什么。 @RobertSnyder 提供了balle 方法。向下滚动:-)

标签: java indexoutofboundsexception


【解决方案1】:

Brother,您正在使用的日志 2 包含以下字符串。 “思科系统日志代理:SYSAGENT:SyslogSeverityMatchFound”。此字符串会产生问题。由于此字符串,拆分返回的数字比您的数组预期的多。只需正确使用它,您的问题就会解决。

希望对你有帮助。

【讨论】:

    【解决方案2】:

    问题在于,当您使用列名重复拆分字符串时,您无意中截断了字符串的其余部分。

    log2 的情况是字符串中出现了两次“严重性”,因此split 的结果是一个三元素数组。然后,您只继续处理索引为 1 的元素中的内容。因此,您将丢弃第二次出现“严重性”之后的内容。

    当您在循环中开始查找字符串“App ID”时,您无法在字符串中找到它,因为它位于第二个“Severity”之后。所以split只返回一个元素,你就得到了你得到的异常。

    要解决这个问题,您应该使用split 的第二个参数来限制该方法返回的令牌数量。而不是:

    auditArray = audit.split(columnlist[i]);
    

    使用

    auditArray = audit.split(columnlist[i], 2);
    

    【讨论】:

    • Cisco Syslog Agent:SYSAGENT:SyslogSeverityMatchFound这个具体
    • 为我工作。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-29
    • 1970-01-01
    • 2016-11-12
    • 2015-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多