Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java multiple.replace不提供任何TouchElementException_Java_Parsing - Fatal编程技术网

Java multiple.replace不提供任何TouchElementException

Java multiple.replace不提供任何TouchElementException,java,parsing,Java,Parsing,编辑: 整个方法是: public static String[] singlemultiplet(String filename, int numofzeros) throws IOException {//isolate notes between brackets Scanner inputmeasure = new Scanner(new DataInputStream(new FileInputStream(filename))); InputS

编辑: 整个方法是:

        public static String[] singlemultiplet(String filename, int numofzeros) throws IOException {//isolate notes between brackets
    Scanner inputmeasure = new Scanner(new DataInputStream(new FileInputStream(filename)));
        InputStream is = new BufferedInputStream(new FileInputStream(filename));
            BufferedReader bReader = new BufferedReader(new InputStreamReader(is));
            StringBuffer sbfFileContents = new StringBuffer();
            String line = null;
            int lineCount = 0;
    int j = 0;
        int[] cmn = new int[countbrackets(filename)];
        String[] numbers = new String[40];
        String[][] matrix = new String[20][120];
        String[][] matrix2 = new String[20][120];
        String[][] matrix3 = new String[20][120];
            line = inputmeasure.useDelimiter("\n").next();
            Scanner s = new Scanner(line).useDelimiter("U");
            matrix[0][0] = s.useDelimiter("\r").next();
            String ubar = "U|";
            matrix2[0][0] = matrix[0][0].replace("\\),","U").replaceAll("\\)","U").replace(ubar,"U");
            matrix3[0][0] = matrix2[0][0].replace("|","U");
            Scanner s2 = new Scanner(matrix3[0][0]).useDelimiter("U");
            String brack = "(";
            String[] multiplet = new String[countmultipletsandmeasures(filename) + numofzeros];
            String[] multiplet2 = new String[countmultipletsandmeasures(filename) + numofzeros];
            Arrays.fill(multiplet, "");
            int cmampluszeros = countmultipletsandmeasures(filename) + numofzeros;
             for (int i = 0; i < cmampluszeros; i++)
             {
              matrix3[0][0] = s2.useDelimiter("U").next();
              multiplet[i] = matrix3[0][0];

             }
             lineCount++;
                    sbfFileContents.append(line);

            String strContent = sbfFileContents.toString();
    try {
        return multiplet;
    } finally {
        is.close();
    }
}
程序给出了块

multiplet[i]
作为

这是正确的。但当我试着读入时: A、 A,A,B,B,C,B,B,C,Bb,Bb,Cb | A,B,C,D,E,F,G,|,A,,,,,,,,,,,,,,,,,,我得到了一个非接触式的例外。正确的输出是:

multiplet: (A#,A#,A#
multiplet: ,(B#,B#,C#
multiplet: ,(B#,B#,C#
multiplet: ,(Bb,Bb,Cb
multiplet: A#,B#,C#,D#, E#,F#,G#,  
multiplet:   ,A,  , ,   ,  ,  ,  ,  ,  ,  , ,   ,  ,  ,  
有人知道我为什么以及我应该做什么来获得正确的输出吗

编辑:

调试将提供以下堆栈跟踪:

断点命中:thread=main,IOguitar.singlemultiplet,line=2769 bci=306 2769 matrix3[0][0]=s2.useDelimiterU.next

主[1]步骤

步骤完成:thread=main,IOguitar.singlemultiplet,line=2770 bci=322 2770多重态[i]=matrix3[0][0]

主[1]步骤

步骤完成:thread=main,IOguitar.singlemultiplet,line=2767 bci=333 2767表示int i=0;i 主[1]步骤

已完成的步骤: 断点命中:thread=main,IOguitar.singlemultiplet,line=2769 bci=306 2769 matrix3[0][0]=s2.useDelimiterU.next

主[1]步骤

步骤完成:thread=main,IOguitar.singlemultiplet,line=2770 bci=322 2770多重态[i]=matrix3[0][0]

主[1]步骤

步骤完成:thread=main,IOguitar.singlemultiplet,line=2767 bci=333 2767表示int i=0;i 主[1]步骤

已完成的步骤: 断点命中:thread=main,IOguitar.singlemultiplet,line=2769 bci=306 2769 matrix3[0][0]=s2.useDelimiterU.next

主[1]步骤

步骤完成:thread=main,IOguitar.singlemultiplet,line=2770 bci=322 2770多重态[i]=matrix3[0][0]

主[1]步骤

步骤完成:thread=main,IOguitar.singlemultiplet,line=2767 bci=333 2767表示int i=0;i 主[1]步骤

已完成的步骤: 断点命中:thread=main,IOguitar.singlemultiplet,line=2769 bci=306 2769 matrix3[0][0]=s2.useDelimiterU.next

主[1]步骤

步骤完成:thread=main,IOguitar.singlemultiplet,line=2770 bci=322 2770多重态[i]=matrix3[0][0]

主[1]步骤

步骤完成:thread=main,IOguitar.singlemultiplet,line=2767 bci=333 2767表示int i=0;i 主[1]步骤

已完成的步骤: 断点命中:thread=main,IOguitar.singlemultiplet,line=2769 bci=306 2769 matrix3[0][0]=s2.useDelimiterU.next

主[1]步骤

步骤完成:thread=main,IOguitar.singlemultiplet,line=2770 bci=322 2770多重态[i]=matrix3[0][0]

主[1]步骤

步骤完成:thread=main,IOguitar.singlemultiplet,line=2767 bci=333 2767表示int i=0;i 主[1]步骤

已完成的步骤: 断点命中:thread=main,IOguitar.singlemultiplet,line=2769 bci=306 2769 matrix3[0][0]=s2.useDelimiterU.next

主[1]步骤

步骤完成:thread=main,IOguitar.singlemultiplet,line=2770 bci=322 2770多重态[i]=matrix3[0][0]

主[1]步骤

步骤完成:thread=main,IOguitar.singlemultiplet,line=2767 bci=333 2767表示int i=0;i 主[1]步骤

已完成的步骤: 断点命中:thread=main,IOguitar.singlemultiplet,line=2769 bci=306 2769 matrix3[0][0]=s2.useDelimiterU.next

主[1]步骤

步骤完成:线程=main,IOguitar.main,行=2662 bci=35573 2662 e.printStackTrace

主[1]步骤

java.util.NoSuchElementException 位于java.util.Scanner.throwForScanner.java:838 位于java.util.Scanner.nextScanner.java:1347 在IOguitar.singlemultipletIOguitar.java:2769 在IOguitar.countmultipletnoiguist.java:3121 在IOguitar.mainIOguitar.java:187

步骤完成:线程=main,IOguitar.main,行=2668 bci=35578 2668}

主要文件[1]

但是我现在必须做什么呢?

是处理这种解析的一种更简单的方法,它是专门为它设计的!。String有一个方便的方法splitString regex,它可以根据需要拆分字符串并将其放置在字符串数组中,就像您需要的那样。下面的一行将实现此目的:

String[] multiplet = "(A#,A#,A#),(B#,B#,C#),(B#,B#,C#),(Bb,Bb,Cb)|(Ab,Ab,Ab),(Bb,Bb,Cb),(Bb,Bb,Cb),(Bb,Bb,Cb)|".split("(\\)|\\|)+");
正则表达式的解释:

\\)
\\转义,因此它是文字

|
这在正则表达式语言中表示或

\\|
文字的|

("|" or ")")+

+表示括号内的任何内容都应该至少有一次,并且是贪婪的,因此,如果两个或多个或|相邻,它将在所有括号内拆分,并且不会在它们之间留下空字符串。

是否可以发布堆栈跟踪?Java:写入一次,到处调试。你试过一步一步地调试你的程序以更好地理解发生了什么吗?我已经在编辑下发布了stacktrace。另外,我认为可能有一种更简单的方法来实现wha
你不想要。如果你能解释你真正想要实现的目标,那可能是获得帮助的一个好方法;在字符串A,A,A,B,B,C,B,B,C,Bb,Bb,Cb | A,B,C,D,E,F,G,|,A,,,,,,,,,,我仍然得到一个无接触元素例外。现在该怎么办?@user1189952.split\\\\\\\\+在这里可以正常工作。。看起来你改变了正则表达式?我有代码:String[]numbers=newstring[40];当line=bReader.readLine!=空{numbers=line.split[\\\\\\\\]+},因此它在该行中读取。但是使用.split |\\\\\\+我仍然得到NoSuchElementException。split为您完成全部工作-您不需要调用scanner.next,在正则表达式之后。。我想还不清楚你想要什么样的最终结果。Regex可以做很多事情,而不仅仅是拆分,它可以真正为您完成所有解析。
\\|
("|" or ")")+