当前位置: 首页 > 知识库问答 >
问题:

奇怪的返回值从java String.split,不知道为什么

司徒墨竹
2023-03-14

我的程序读取一个自定义生成的字符串,它遵循以下模式

#INT{0,1,2}/STRING/LONG#INT{0,1,2}/STRING/LONG##

这是字符串开头和结尾的一个散列,分隔每个子字符串,每个子字符串包含0-2的int、字符串名称和长值(取自系统时钟)。这些子值由前斜杠分隔。

我的程序成功地在函数“splitOnHash”的散列上拆分了主字符串,并将其分配给一个字符串数组列表,我可以打印出来,这似乎工作得很好。

接下来,在第二个函数中,我遍历这个新的arraylist,我想拆分“/”字符上的每个子字符串,并将每个值粘贴到一个自定义的“JustificationEvent”对象中。这是我的密码:

package sg;

import java.util.ArrayList;
import java.util.List;
import sg.events.HesitationEvent;

public class HesitationDataReader {

private static List<String> substrings = new ArrayList<String>();
private static List<HesitationEvent> events = new ArrayList<HesitationEvent>();

private static void splitOnHash(String HesData) {
    for (String ret : HesData.split("#")) {
        if (ret!= "") substrings.add(ret);
    }
}

private static void createEventObjects() {
    int code;
    String object;
    long time;
    int c = 1;

    for (String sub : substrings) {
        System.out.println("count " + c);
        c++;
        String[] comp = sub.split("/");

        System.out.println("comp:"+comp+":comp");

        code = Integer.parseInt(comp[0]);
        object = comp[1];
        time = Long.parseLong(comp[2]);

        HesitationEvent hes = new HesitationEvent(code, object, time);
        events.add(hes);
    }
}


public static void main (String args[]) {
    String ourString = "#0/diamonds4/1392748304285#2/diamonds4/1392748304333#0/hearts7/1392748304364#2/hearts7/1392748305035#" +
            "1/deck/1392748305456#1/deck/1392748311696#1/deck/1392748313489#1/deck/1392748315490#0/clubs7/1392748317599#" +
            "2/clubs7/1392748317623#0/clubs5/1392748317623#2/clubs5/1392748317647#0/spades3/1392748317647#2/spades3/1392748323913#" +
            "1/spades3/1392748324616#2/spades3/1392748324710#0/diamonds4/1392748324710#2/diamonds4/1392748324734#0/clubs5/1392748324782#" +
            "2/clubs5/1392748325126#2/clubs5/1392748325214#1/clubs5/1392748325625#2/clubs5/1392748325782#0/spades6/1392748325806#" +
            "2/spades6/1392748325918#0/spades3/1392748326006#2/spades3/1392748326262#0/diamonds4/1392748326262#2/diamonds4/1392748326678#" +
            "2/diamonds4/1392748326830#1/diamonds4/1392748327498#2/diamonds4/1392748328094#0/spades6/1392748328118#2/spades6/1392748328206#" +
            "0/diamonds13/1392748328238#2/diamonds13/1392748328534#0/diamonds13/1392748328790#2/diamonds13/1392748329046#0/hearts7/1392748329582#" +
            "2/hearts7/1392748329942#0/hearts7/1392748330150#2/hearts7/1392748330246#0/hearts7/1392748330454#2/hearts7/1392748330654#" +
            "1/deck/1392748333057#0/spades10/1392748333990#2/spades10/1392748334006#0/clubs13/1392748334006#2/clubs13/1392748334038#" +
            "0/hearts1/1392748334038#2/hearts1/1392748334477#1/hearts1/1392748334927#2/hearts1/1392748335093#0/diamonds13/1392748335261#" +
            "2/diamonds13/1392748335325#0/hearts7/1392748335341#2/hearts7/1392748335797#2/hearts7/1392748336013#2/hearts7/1392748336237#" +
            "2/hearts7/1392748336325#2/hearts7/1392748336429#1/hearts7/1392748337240#2/hearts7/1392748337517#0/clubs4/1392748337525#" +
            "2/clubs4/1392748337557#0/diamonds4/1392748337565#2/diamonds4/1392748337573#0/clubs5/1392748337573#2/clubs5/1392748337581#" +
            "0/hearts6/1392748337581#2/hearts6/1392748337589#0/spades6/1392748337589#2/spades6/1392748337613#0/diamonds13/1392748337629#" +
            "2/diamonds13/1392748337637#0/spades10/1392748337653#2/spades10/1392748337661#0/spades10/1392748337933#2/spades10/1392748337965#" +
            "0/clubs13/1392748337965#2/clubs13/1392748338509#2/clubs13/1392748338557#1/clubs13/1392748338919#2/clubs13/1392748339237#" +
            "1/deck/1392748341879#0/clubs13/1392748342477#2/clubs13/1392748342549#0/spades6/1392748345549#2/spades6/1392748345581#" +
            "0/hearts1/1392748345637#2/hearts1/1392748345837#0/hearts1/1392748346421#2/hearts1/1392748346661#0/hearts9/1392748350302#" +
            "2/hearts9/1392748350381#0/spades11/1392748350381#2/spades11/1392748350381#0/hearts2/1392748350381#2/hearts2/1392748350397#";

    splitOnHash(ourString);
    //for (String s:substrings) {
    //  System.out.println(s);
    //}
    createEventObjects();   
    }

}

请忽略变量c和底部的for循环,我使用c来确定for循环在什么时候崩溃(第一次迭代)。底部的for循环(注释掉)用于确认我的splitOnHash函数返回了我期望的结果(它似乎工作正常)。

因此,本质上我试图将每个子字符串拆分为一个数组,然后将每个值提取并转换为正确的类型。我还尝试使用split(“/”,3)返回3个值,但结果相同,即:

count 1
Exception in thread "main" comp:[Ljava.lang.String;@1fae3c6:comp
java.lang.NumberFormatException: For input string: ""
    at java.lang.NumberFormatException.forInputString(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at sg.HesitationDataReader.createEventObjects(HesitationDataReader.java:30)
    at sg.HesitationDataReader.main(HesitationDataReader.java:87)

这里很难说,但是“comp:[Ljava.lang.字符串;@1fae3c6: comp”实际上是由于某种原因出现在异常中的程序的输出。这是从一行,我试图打印出comp的值,由comp: VALUE: comp包围(我这样做是为了防止它打印空或空字符串,所以我可以看到冒号之间没有空隙。

因此,出于某种原因,在第一次迭代中,sub.split的输出到字符串[]comp生成“Ljava.lang.String;@1fae3c6”,而我希望它会产生类似这样的结果:“0钻石4 1392748304285”。

我只是更改了代码以尝试访问阵列中的一个位置,而不是打印所有3个段,我得到了以下错误:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
at sg.HesitationDataReader.createEventObjects(HesitationDataReader.java:29)
    at sg.HesitationDataReader.main(HesitationDataReader.java:89)

这里明明有问题,却看不出问题!我不能使用我用来分割哈希的原始方法,因为这次我不会以任何顺序返回字符串,我想访问特定的值并将它们转换为特定的类型。

提前感谢您的帮助!

共有1个答案

黄景胜
2023-03-14

问题是:

(ret!= "")

应该是:

  if (!ret.equals("")) 

我相信这个错误导致插入空字符串。

 类似资料:
  • 但是,当从handleAsyncErrors()流链接ObjectNode并到达相同的httpCallbackFlow()时,我们会得到一个异常,该异常由 restClientException:无法写入请求:在org.springframework.web.client.restTemplate$HttpEntityRequestCallback.dowithRequest(restTempla

  • 问题内容: 尝试这段代码。为什么getValueB()返回1而不是2?毕竟,递增两次被调用两次。 问题答案: 毕竟,递增两次被调用两次。 是的,但是返回值是 在 第二次调用 之前 确定的。 返回的值由该 时间点在 return语句中的表达式求值确定,而不是“仅在执行离开方法之前”。 从JLS的14.17节开始: 一个带有Expression的return语句试图将控制权转移到包含它的方法的调用者;

  • 为什么in\u array()有时表现得如此奇怪,并返回如此意外的结果? 我们来看几个例子: 嗯?这里发生了什么!? (几年前,我开始怀疑这种奇怪的行为。不过我认为它可能对某些人有用,所以我进入了这个问题。)

  • 如果参数的类型是int或float,函数应该返回>函数输入的绝对值。 否则,函数应返回“nope” 我已经完成了第一个任务,但我认为我已经完成了任务

  • 输入df。mean() 输出: 输入 (正确)输出: “a”中的类型值col=int 其他col具有str值 为什么会发生这种情况

  • > 控制器 } 服务 -板 > 原因:java。lang.IllegalArgumentException:给定的id不能为null!位于组织。springframework。util。明确肯定组织中的notNull(Assert.java:201)。springframework。数据jpa。存储库。支持简单Parepository。java上的deleteById(SimpleJpaRepos