Ошибка считывания с файла

335
13 февраля 2018, 08:05

Есть метод, который конвертирует OBJ файл (3д модель). indices содержит массив строк информации многоугольника, например 1//3, после операции split("/") indices содержит: {"1","","3"}

Проблема начинается вот в этой строчке:

if (indices.length > 1 && !indices[1].equals("")) {
   index.texIdx = Integer.parseInt(indices[1]);
}

indices[1] = пустой строке, но компилятор почему- то заходит в условие.

Вот весь метод:

@Override
    public Geometry load(final Path file) throws IOException {
        final ArrayList<Vector3f> positions = new ArrayList<>();
        final ArrayList<Vector2f> texCoords = new ArrayList<>();
        final ArrayList<MultiIndex> idx = new ArrayList<>();
        //final ArrayList
        Files.lines(file)
                .forEachOrdered(line -> {
                    final Predicate<String> isVertex = POSITION.asPredicate();
                    final Predicate<String> isTexCoord = TEXCOORD.asPredicate();
                    final Predicate<String> isTriangle = TRIANGLE.asPredicate();
                    if (isVertex.test(line)) {
                        line = line.replaceFirst("^v\\s{1,4}", "");
                        final String[] coords = line.split("\\s");
                        final float x = Float.parseFloat(coords[0]);
                        final float y = Float.parseFloat(coords[1]);
                        final float z = Float.parseFloat(coords[2]);
                        positions.add(new Vector3f(x, y, z));
                    } else if (isTexCoord.test(line)) {
                        line = line.replaceFirst("^v\\s{1,4}", "");
                        final String[] coords = line.split("\\s");
                        final float u = Float.parseFloat(coords[0]);
                        final float v = Float.parseFloat(coords[1]);
                        texCoords.add(new Vector2f(u, v));
                    } else if (isTriangle.test(line)) {
                        line = line.replaceFirst("^f\\s{1,4}", "");
                        final String[] vertexIndices = line.split("\\s");
                        for (String indexString : vertexIndices) {
                            final MultiIndex index = new MultiIndex();
                            final String[] indices = indexString.split("/");
                            index.positionIdx = Integer.parseInt(indices[0]);
                            if (indices.length > 1 && !indices[1].equals("")) {
                                index.texIdx = Integer.parseInt(indices[1]);
                            }

                            idx.add(index);
                        }
                    }
                });
        final List<Integer> indexData = idx.stream()
                .map(multiIndex -> multiIndex.positionIdx)
                .collect(Collectors.toList());
        if (!texCoords.isEmpty()) {
            final ArrayList<Vector2f> resolvedTexCoords = new ArrayList<>(positions.size());
            //@TODO not yet ready
            return null;
        } else {
            return new IndexedGeometry(positions, indexData);
        }
    }

Вот стектрейс:

java.lang.NumberFormatException: For input string: ""
    at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    at java.base/java.lang.Integer.parseInt(Integer.java:662)
    at java.base/java.lang.Integer.parseInt(Integer.java:770)
    at com.tosken.ngin.geometry.loader.ObjLoader.lambda$load$0(ObjLoader.java:63)
    at java.base/java.nio.file.FileChannelLinesSpliterator.forEachRemaining(FileChannelLinesSpliterator.java:114)
    at java.base/java.util.stream.ReferencePipeline$Head.forEachOrdered(ReferencePipeline.java:601)
    at com.tosken.ngin.geometry.loader.ObjLoader.load(ObjLoader.java:36)
    at com.tosken.ngin.geometry.loader.ObjLoaderTest.load(ObjLoaderTest.java:17)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:564)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
    at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
READ ALSO
Предупреждение: work_time.xml has more than 80 views, bad for performance

Предупреждение: work_time.xml has more than 80 views, bad for performance

В одном layout у меня много компонентов, вот скрин:

207
Добавить обработчик двойных нажатий

Добавить обработчик двойных нажатий

OnSwipeTouchListenerjava В данный код необходимо добавить двойное нажатие

224
Java. Hibernate. проблема с transactionManager

Java. Hibernate. проблема с transactionManager

И так , по порядку:

232
x/c == 7 или x%7 == 0

x/c == 7 или x%7 == 0

Я понимаю, что вопрос банально прост, но, не бывает глупых вопросов)

187