Есть метод, который конвертирует 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)
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
В одном layout у меня много компонентов, вот скрин:
OnSwipeTouchListenerjava В данный код необходимо добавить двойное нажатие