标签: java-8

Java 1.8 ASM ClassReader failed to parse class file - probably due to a new Java class file version that isn't supported yet

My web application runs fine on JDK 1.7 but crashes on 1.8 with the following exception (during application server startup with Jetty 8). I am using Spring version: 3.2.5.RELEASE.

Exception:

org.springframework.core.NestedIOException: ASM ClassReader failed to parse class file - probably due to a new Java class file version that isn't supported yet

I assume that problem occurs because of spring and "asm.jar" library on which it depends.

How do I resolve this?

java spring java-8

78
推荐指数
2
解决办法
8万
查看次数

在JRE 8中使用JavaFX,"访问限制"错误

当我在新的java 8项目中尝试使用与javafx相关的类时,我从eclipse中获得了访问限制错误.到目前为止,我能找到的唯一"解决方案"是告诉eclipse忽略访问限制,但我对此并不满意.错误的一个例子:

Access restriction: The type Pane is not accessible due to 
restriction on required library C:\Program Files\Java\jre8_0\lib\ext\jfxrt.jar
Run Code Online (Sandbox Code Playgroud)

我正在使用Eclipse Kepler和Java 8的Eclipse JDT补丁.

这似乎是与JavaFX不是JavaSE执行环境的一部分有关的问题.

我现在很困惑,因为根据http://en.wikipedia.org/wiki/JavaFX,javaFX是JavaSE的一部分.是否有可能Eclipse没有认识到它是javaSE的一部分?

java eclipse javafx java-8

78
推荐指数
6
解决办法
9万
查看次数

正确使用Optional.ifPresent()

我试图理解Java 8中API 的ifPresent()方法Optional.

我有简单的逻辑:

Optional<User> user=...
user.ifPresent(doSomethingWithUser(user.get()));
Run Code Online (Sandbox Code Playgroud)

但这会导致编译错误:

ifPresent(java.util.functionError:(186, 74) java: 'void' type not allowed here)
Run Code Online (Sandbox Code Playgroud)

我当然可以这样做:

if(user.isPresent())
{
  doSomethingWithUser(user.get());
}
Run Code Online (Sandbox Code Playgroud)

但这就像一张杂乱无章的null支票.

如果我将代码更改为:

 user.ifPresent(new Consumer<User>() {
            @Override public void accept(User user) {
                doSomethingWithUser(user.get());
            }
        });
Run Code Online (Sandbox Code Playgroud)

代码变得越来越脏,这让我想到回到旧的null支票.

有任何想法吗?

java lambda optional java-8

78
推荐指数
5
解决办法
14万
查看次数

如何在Java 8和Java 9中使用unsigned Integer?

在Oracle"原始数据类型" 页面中,它提到Java 8增加了对无符号整数和长整数的支持:

int:默认情况下,int数据类型是32位带符号的二进制补码整数,其最小值为-2 31,最大值为2 31 -1.在Java SE 8及更高版本中,您可以使用int数据类型表示无符号的32位整数,其最小值为0,最大值为2 32 -1.使用Integer该类将int数据类型用作无符号整数.有关更多信息,请参阅数字类一节.像静态方法compareUnsigned,divideUnsigned等已被添加到Integer类,以支持算术运算的无符号整数.

long:long数据类型是64位二进制补码整数.签名long的最小值为-2 63,最大值为2 63 -1.在Java SE 8及更高版本中,您可以使用long数据类型表示无符号64位long,其最小值为0,最大值为2 64 -1.当需要比int提供的值更宽的值时,请使用此数据类型.本Long类也包含类似的方法compareUnsigned,divideUnsigned等支持算术运算的无符号long.

但是,我发现无法声明无符号长整数或整数.例如,下面的代码给出了编译器错误消息"文字超出范围"(我当然使用的是Java 8),当它应该在范围内时(指定的值恰好是2 64 -1) :

public class Foo {
    static long values = 18446744073709551615L;

    public static void main(String[] args){
        System.out.println(values);
    }  
} …
Run Code Online (Sandbox Code Playgroud)

java unsigned java-8

78
推荐指数
5
解决办法
10万
查看次数

Java 7和8中方法的最大大小

我知道Java的方法不能大于64 KB.该限制导致我们从JavaCC语法生成代码的问题.我们遇到了Java 6的问题,并且能够通过更改语法来解决这个问题.是否已针对Java 7更改了限制,还是计划用于Java 8?

只是为了说清楚.我自己不需要大于64 KB的方法.但我写了一个语法,编译成一个非常大的方法.

java java-7 java-8

77
推荐指数
3
解决办法
2万
查看次数

为什么这个Java 8程序无法编译?

这个程序在Java 7(或Java 8中-source 7)编译得很好,但是无法用Java 8编译:

interface Iface<T> {}
class Impl implements Iface<Impl> {}

class Acceptor<T extends Iface<T>> {
    public Acceptor(T obj) {}
}

public class Main {
    public static void main(String[] args) {
        Acceptor<?> acceptor = new Acceptor<>(new Impl());
    }
}
Run Code Online (Sandbox Code Playgroud)

结果:

Main.java:10: error: incompatible types: cannot infer type arguments for Acceptor<>
        Acceptor<?> acceptor = new Acceptor<>(new Impl());
                                           ^
    reason: inference variable T has incompatible bounds
      equality constraints: Impl
      upper bounds: Iface<CAP#1>,Iface<T>
  where T is a type-variable:
    T …
Run Code Online (Sandbox Code Playgroud)

java generics type-inference java-8

77
推荐指数
3
解决办法
2万
查看次数

如果找到的第一个元素为null,为什么findFirst()会抛出NullPointerException?

为什么这会抛出java.lang.NullPointerException

List<String> strings = new ArrayList<>();
        strings.add(null);
        strings.add("test");

        String firstString = strings.stream()
                .findFirst()      // Exception thrown here
                .orElse("StringWhenListIsEmpty");
                //.orElse(null);  // Changing the `orElse()` to avoid ambiguity
Run Code Online (Sandbox Code Playgroud)

第一项stringsnull,这是一个完全可以接受的值.此外,findFirst()返回一个Optional,这对于findFirst()能够处理nulls 更有意义.

编辑:更新orElse()不那么模棱两可.

java optional java-8 java-stream

77
推荐指数
4
解决办法
6万
查看次数

为什么\ R在Java 8和Java 9之间的正则表达式中表现不同?

以下代码在Java 8和9中编译,但行为不同.

class Simple {
    static String sample = "\nEn un lugar\r\nde la Mancha\nde cuyo nombre\r\nno quiero acordarme";

    public static void main(String args[]){
        String[] chunks = sample.split("\\R\\R");
        for (String chunk: chunks) {
            System.out.println("Chunk : "+chunk);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当我用Java 8运行它时,它返回:

Chunk : 
En un lugar
de la Mancha
de cuyo nombre
no quiero acordarme
Run Code Online (Sandbox Code Playgroud)

但是当我使用Java 9运行它时,输出是不同的:

Chunk : 
En un lugar
Chunk : de la Mancha
de cuyo nombre
Chunk : no quiero acordarme
Run Code Online (Sandbox Code Playgroud)

为什么?

java regex unicode java-8 java-9

77
推荐指数
2
解决办法
3179
查看次数

在java中从lambda forEach()返回

我试图将一些for-each循环更改为lambda forEach()-methods以发现lambda表达式的可能性.以下似乎是可能的:

ArrayList<Player> playersOfTeam = new ArrayList<Player>();      
for (Player player : players) {
    if (player.getTeam().equals(teamName)) {
        playersOfTeam.add(player);
    }
}
Run Code Online (Sandbox Code Playgroud)

随着lambda forEach()

players.forEach(player->{if (player.getTeam().equals(teamName)) {playersOfTeam.add(player);}});
Run Code Online (Sandbox Code Playgroud)

但下一个工作不起作用:

for (Player player : players) {
    if (player.getName().contains(name)) {
        return player;
    }
}
Run Code Online (Sandbox Code Playgroud)

与lambda

players.forEach(player->{if (player.getName().contains(name)) {return player;}});
Run Code Online (Sandbox Code Playgroud)

最后一行的语法有问题还是不可能从forEach()方法返回?

java foreach lambda return-type java-8

76
推荐指数
4
解决办法
11万
查看次数

有没有办法比较lambdas?

假设我有一个使用lambda表达式(闭包)定义的对象列表.有没有办法检查它们,以便可以进行比较?

我最感兴趣的代码是

    List<Strategy> strategies = getStrategies();
    Strategy a = (Strategy) this::a;
    if (strategies.contains(a)) { // ...
Run Code Online (Sandbox Code Playgroud)

完整的代码是

import java.util.Arrays;
import java.util.List;

public class ClosureEqualsMain {
    interface Strategy {
        void invoke(/*args*/);
        default boolean equals(Object o) { // doesn't compile
            return Closures.equals(this, o);
        }
    }

    public void a() { }
    public void b() { }
    public void c() { }

    public List<Strategy> getStrategies() {
        return Arrays.asList(this::a, this::b, this::c);
    }

    private void testStrategies() {
        List<Strategy> strategies = getStrategies();
        System.out.println(strategies);
        Strategy a = (Strategy) …
Run Code Online (Sandbox Code Playgroud)

java lambda java-8

76
推荐指数
3
解决办法
1万
查看次数