gpt4 book ai didi

Java 8 : Reflection Field. get() try catch 错误

转载 作者:行者123 更新时间:2023-12-01 22:31:57 26 4
gpt4 key购买 nike

问题

我在 Eclipse 中收到一条错误,指出我在调用 Field.get(Object) 时出现未处理的异常。当我将代码包装在推荐的 try-catch 中时,错误仍然存​​在。我假设我必须使用 try-catch 将参数包装在 get() 方法中。这可能吗?

错误

Unhandled exception type IllegalAccessException

有问题的行:

return list.stream().map(e -> fieldType.cast(f.get(e))).collect(Collectors.toList());

代码

Main.java

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class Main {
public static void main(String[] args) {
List<Entity> entities = Arrays.asList(
new Item(0, "Apple"),
new Item(1, "Banana"),
new Item(2, "Grape"),
new Item(3, "Orange")
);

List<Long> ids = null;
try {
ids = pluck("id", Long.class, entities, Entity.class, true);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(ids);
}

public static <E extends Entity> List<Long> pluckIds(List<E> list) {
return list.stream().map(e -> e.getId()).collect(Collectors.toList());
}

public static <T,F> List<F> pluck(String fieldName, Class<F> fieldType,
List<T> list, Class<T> listType, boolean useLambda)
throws NoSuchFieldException, IllegalAccessException,
IllegalArgumentException {
Field f = listType.getDeclaredField(fieldName);
f.setAccessible(true);

if (useLambda) {
return list.stream().map(e -> fieldType.cast(f.get(e))).collect(Collectors.toList());
} else {
List<F> result = new ArrayList<F>();
for (T element : list) {
result.add(fieldType.cast(f.get(element)));
}
return result;
}
}
}

Item.java

public class Item extends Entity {
private String name;

public Item(long id, String name) {
super(id);
this.setName(name);
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

Entity.java

public abstract class Entity {
private long id;

public Entity(long id) {
this.id = id;
}

public long getId() {
return id;
}

public void setId(long id) {
this.id = id;
}
}

最佳答案

Eclipse 现在有点愚蠢(可能有一个错误)。

这里有一个 lambda 表达式

return list.stream().map(e -> fieldType.cast(f.get(e))).collect(Collectors.toList());

Field#get(Object) 被声明为抛出已检查的异常。但是您正在实现的函数式接口(interface)方​​法 Function#apply(Object) 却没有。 Eclipse 很愚蠢,因为它建议您将语句包装在 try block 中,但它在整个事情周围添加了 try block

try {
return list.stream().map(e -> fieldType.cast(f.get(e))).collect(Collectors.toList());
} catch (Exception e) {
}

实际上应该将其添加到 lambda 的主体中

return list.stream().map(e -> {
try {
return fieldType.cast(f.get(e));
} catch (Exception e) {
return /* something else */ null; // or throw an unchecked exception
}
}).collect(Collectors.toList());

当你的 lambda 主体是一个简单的表达式而不是一个 block 时,这似乎会发生。

关于Java 8 : Reflection Field. get() try catch 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27572594/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com