小编fge*_*fge的帖子

Java:变量"可能已经初始化",但我不明白如何

首先是一些上下文:下面粘贴的所有代码都在另一个声明为的类中public class TheClass extends SomeProprietaryClass.我不能出于各种原因在另一个文件中声明这些类...并且日志消息是法语.而且我是一个"最后快乐"的程序员.这是问题的核心......

现在,代码......(可能太多了 - 按要求剥离只保留相关部分)

自定义异常:

private static final class BreadCrumbException
    extends Exception
{
    private BreadCrumbException(final String message)
    {
        super(message);
    }

    private BreadCrumbException(final String message, final Throwable cause)
    {
        super(message, cause);
    }
}
Run Code Online (Sandbox Code Playgroud)

用于"实现"面包屑元素可见性的枚举:

private enum Visibility
{
    MAINPAGE("R"),
    MENU("M"),
    BREADCRUMB("A"),
    COMMERCIAL("C");

    private static final Map<String, Visibility> reverseMap
        = new HashMap<String, Visibility>();

    private static final String characterClass;

    static {
        final StringBuilder sb = new StringBuilder("[");

        for (final Visibility v: values()) {
            reverseMap.put(v.flag, v);
            sb.append(v.flag);
        } …
Run Code Online (Sandbox Code Playgroud)

java final

5
推荐指数
1
解决办法
1484
查看次数

我每次将项目导入eclipse作为gradle时都会下载Gradle?

我试图在我的本地机器上配置几个gradle项目.这就是我做的:

命令行:

将目录更改为我要构建的项目.

./gradlew build
Run Code Online (Sandbox Code Playgroud)

它开始下载第一次非常正常.现在,每当我尝试构建此项目或使用相同版本的任何其他项目时,它首先下载gradle.

日食

我尝试导入Gradle项目,然后BuildModel它开始下载gradle,现在每次我尝试其他项目甚至尝试再次导入同一个项目时,它开始下载.

题?

这是正常的还是环境破裂了?如果以后是这种情况,我该如何解决?

eclipse command-line gradle gradlew

5
推荐指数
0
解决办法
767
查看次数

Lambda匹配FunctionalInterface的签名,但"没有".你怎么解释这个论点完全被传递了?

我目前正在研究这个项目.它运作得非常好.

然而,在重新阅读README之后,我开始怀疑如何记录一些困扰我的东西......

引用这个例子,并忘记抛出异常,它的内容如下:

Files.list(somePath).map(Path::toRealPath).forEach(System.out::println)
Run Code Online (Sandbox Code Playgroud)

好.现在,Path涉及的方法就是这个.当然,我们没有通过任何LinkOption.

再说一遍:让我们忘记它抛出任何异常.

流的.map()需要Function作为参数.此接口用于Function<T, R>定义为:

R apply(T t);
Run Code Online (Sandbox Code Playgroud)

但我使用的方法不接受任何参数.乍一看,它似乎不匹配Function,对吗?除了那个...

它可以写成:

path -> path.toRealPath()
Run Code Online (Sandbox Code Playgroud)

因此,如果方法引用没有参数,或类似的东西,它看起来像使用的机制有点能够调用"流对象"上的方法...

我想相应地记录下来,我在这里遗漏了一些东西.

我错过了什么?

java lambda invokedynamic java-8

5
推荐指数
1
解决办法
95
查看次数

为什么Spliterator <?>将NONNULL定义为特征?

的javadoc的Spliterator(这基本上是什么是真正的背后Stream,如果我理解正确的事情)定义了许多习性研究其意义如SIZED,CONCURRENT,IMMUTABLE等.

但它也定义了NONNULL; 为什么?

但是,我确定用户有责任确保这一点,例如,如果开发人员尝试.sort()使用无SORTED元素的非流媒体,他/她就会受到NPE的欢迎......

但是这个特征存在.为什么?的Javadoc,Spliterator本身并没有提到它的任何实际使用,而且也不该package-info.java在的java.util.stream包...

java null java-8 java-stream

5
推荐指数
1
解决办法
279
查看次数

@FunctionalInterface如何影响JVM的运行时行为?

我最初的问题是这个问题的完全重复; 也就是说,为什么这个接口有一个运行时保留策略.

但是接受的答案根本不能满足我,原因有两个:

  • 事实上这个界面@Documented(我相信)与它无关(虽然为什么@Documented运行时保留策略对我来说也是一个谜);
  • 尽管在Java 8之前Java中存在许多"将来"功能接口(Comparable正如答案所提到的那样,但也Runnable等),这并不妨碍它们被用作"替代品"(例如,你可以完美地使用DirectoryStream.Filteras作为例如,Predicate如果您所做的只是过滤Path,则替换为a .

但是,它仍有这种保留.这意味着它必须以某种方式影响JVM行为.怎么样?

java annotations java-8

5
推荐指数
1
解决办法
116
查看次数

使用Java API生成属性文件时,为什么使用反斜杠转义冒号?

示例代码:

public final class Test
{
    public static void main(final String... args)
        throws IOException
    {
        final Properties properties = new Properties();

        properties.setProperty("foo", "bar:baz");

        // Yeah, this supposes a Unix-like system
        final Path path = Paths.get("/tmp/x.properties");

        try (
            // Requires Java 8!
            final Writer writer = Files.newBufferedWriter(path);
        ) {
            properties.store(writer, null);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,当我:

$ cat /tmp/x.properties 
# The date here
foo=bar\:baz
Run Code Online (Sandbox Code Playgroud)

冒号用反斜杠逃脱.事实上,所有的冒号都是.

奇怪的是,如果我手动生成属性文件并且 "冒走"冒号,那么也会读取属性.

那么,为什么编写过程Properties(无论你使用的方式Writer还是OutputStream顺便使用的方式)以这种方式逃避冒号?

java properties-file

5
推荐指数
1
解决办法
337
查看次数

StandardOpenOption.SPARSE的用途是什么?

Java 7 定义了该选项,但我仍然无法理解它的用处。

public static void main(final String... args)
    throws IOException
{
    final long offset = 1L << 31;
    final RandomAccessFile f = new RandomAccessFile("/tmp/foo", "rw");
    f.seek(offset);
    f.writeInt(2);
    f.close();
}
Run Code Online (Sandbox Code Playgroud)

当我查询文件“ shell wise”时,我得到了预期的结果:

$ cd /tmp
$ stat --format %s foo
2147483652
$ du --block-size=1 foo
4096    foo
Run Code Online (Sandbox Code Playgroud)

也就是说,inode真实地声明该文件的大小接近2 GB,但是由于基础fs的块大小为4k,因此其磁盘使用情况实际上是一个块。好。

但是我不需要Java 7 StandardOpenOption.SPARSE。实际上,如果我使用Java 7 JVM运行此完全相同的代码,则结果不会改变。

现在,转到一些仅Java 7的代码:

public static void main(final String... args)
    throws IOException
{
    final ByteBuffer buf = ByteBuffer.allocate(4).putInt(2);
    buf.rewind();

    final OpenOption[] options = {
        StandardOpenOption.WRITE, …
Run Code Online (Sandbox Code Playgroud)

java filesystems file-io java-7

4
推荐指数
1
解决办法
1616
查看次数

使用 Java 正则表达式匹配 BMP 之外的一系列 Unicode 代码点:这可能吗?

虽然一开始完全不相关,但这个问题让我想知道......

Java 的正则表达式基于Strings;Strings 是 s 的序列(数组)char;和chars 最终是 UTF-16 代码单元。

后者意味着单个char可以匹配 BMP 内的任何 Unicode 代码点,即从 U+0000 到 U+FFFF。

然而,在 BMP 之外,char单个代码点需要两个s(一个用于前导代理,另一个用于尾随代理);从我所见,除了专用的语法引擎,我看不到 Java 正则表达式(由 定义java.util.regex.Pattern)为此类代码点定义“字符类”的方法,因为在BMP。

尽管可以编写代码为此类范围生成正则表达式(好吧,用作正则表达式的字符串文字),但是否存在Pattern未记录在案并允许这样做的现有机制?

java regex unicode

4
推荐指数
1
解决办法
2158
查看次数

在这种情况下,我如何处理 Function&lt;T, R&gt; 和省略号/可变参数?

我的一个项目是throwing-lambdas;在其中,我的目标是简化@FunctionalInterfaces 中潜在s的使用Stream,其在流中使用的唯一“缺陷”是它们抛出已检查的异常(就我而言,我宁愿称其为有缺陷的事实,即您不能抛出已检查的异常来自流,但那是另一个故事)。

所以,因为Function<T, R>我定义了这个:

@FunctionalInterface
public interface ThrowingFunction<T, R>
    extends Function<T, R>
{
    R doApply(T t)
        throws Throwable;

    default R apply(T t)
    {
        try {
            return doApply(t);
        } catch (Error | RuntimeException e) {
            throw e;
        } catch (Throwable throwable) {
            throw new ThrownByLambdaException(throwable);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这允许我定义,例如:

final ThrowingFunction<Path, Path> = Path::toRealPath;
Run Code Online (Sandbox Code Playgroud)

(为什么Path::toRealPath......好吧,正是因为它有一个省略号)。

不想停在这里,我希望能够写出这样的东西:

Throwing.function(Path::toRealPath).fallbackTo(Path::toAbsolutePath)
Run Code Online (Sandbox Code Playgroud)

以上几乎有效......继续阅读。

我也这样定义:

public abstract class Chainer<N, T extends N, C extends Chainer<N, …
Run Code Online (Sandbox Code Playgroud)

java lambda variadic-functions java-8 java-stream

4
推荐指数
2
解决办法
456
查看次数

使用JIMFS创建虚拟文件系统

我想使用Google的JIMFS创建用于测试目的的虚拟文件系统.不过,我很难入门.

我查看了这个教程:http://www.hascode.com/2015/03/creating-in-memory-file-systems-with-googles-jimfs/

但是,当我创建文件系统时,它实际上是在现有文件系统中创建的,即我不能这样做:

Files.createDirectory("/ virtualfolder");`因为我被拒绝访问.

我错过了什么吗?

目前,我的代码看起来像这样:

测试类:

    FileSystem fs = Jimfs.newFileSystem(Configuration.unix());
    Path vTargetFolder = fs.getPath("/Store/homes/linux/abc/virtual");

TestedClass test = new TestedClass(vTargetFolder.toAbsolutePath().toString());
Run Code Online (Sandbox Code Playgroud)

Java类在某处:

targetPath = Paths.get(targetName);
Files.createDirectory(targetPath);

// etc., creating files and writing them to the target directory
Run Code Online (Sandbox Code Playgroud)

但是,我创建了一个单独的类来测试JIMFS,这里目录的创建并没有失败,但是我不能像这样创建一个新文件:

FileSystem fs = Jimfs.newFileSystem(Configuration.unix());
Path data = fs.getPath("/virtual");
Path dir = Files.createDirectory(data);


Path file = Files.createFile(Paths.get(dir + "/abc.txt")); // throws NoSuchFileException
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

java java.nio.file jimfs jsr203

4
推荐指数
1
解决办法
5195
查看次数