小编use*_*408的帖子

publicId 和 systemId 之间需要空格,但 XML 看起来没问题

我刚刚拿出几个月前写的一段代码。该代码从 Web 服务器获取 XML 文档并使用 JAXB 对其进行解析。上次我尝试时,效果非常好;现在我遇到了一个例外:

\n\n
org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 50; White spaces are required between publicId and systemId.\n    at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:257)\n    at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:339)\n    at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:121)\n
Run Code Online (Sandbox Code Playgroud)\n\n

环顾四周,这表明 XML 标头数据存在一些问题,即<!DOCTYPE ...>. 答案表明该声明具有误导性:在所描述的情况下,systemId 完全丢失,尽管错误只是抱怨其前面缺少空格。

\n\n

但是,如果我使用 Web 浏览器获取 XML 文档,它甚至不包含标<!DOCTYPE ...>头。

\n\n

解析我几个月前检索到的 XML 文档没有出现任何问题。

\n\n

如果我比较今天检索到的文档和几个月前的文档,则两者在根元素的开头都是完全相同的。

\n

jaxb xml-parsing

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

找出InputStream是否关闭

java.io.InputStream在尝试读取a 之前,Java是否有任何可靠的方法来确定a 是否关闭?

我的用例是我有一个接受InputStream参数并从中读取参数的方法。该方法在其自己的线程中运行,如果输入流关闭,我想终止该线程。

InputStreamImplements Closeable,它提供一种close()方法,但显然无法查询实例是否已关闭。

尝试从封闭状态读取InputStream将引发IOException,但可能还有其他原因,并且接口合同中没有任何内容说明这种情况是否永久存在,或者在某些情况下是否有可能在某个时候消失。

我的方法的调用者可以提供所需的任何子类InputStream,因此不能依靠特定的子类行为。

还有其他想法吗?

java inputstream

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

在 Android 上使用 java.time 时出现 NoClassDefFoundError

我的 Android 应用程序使用的 JAR 依赖于 中的一些类java.time,例如LocalTime,因此至少需要 Java 8。

网上的多个消息来源指出,更高版本的 Android 和工具链支持 Java 8。

我使用 gradle 构建我的应用程序,但不使用(或希望使用)Android Studio。我使用该插件的 3.1.4 版本(最新版本与 Gradle 4.4 兼容,该版本随撰写本文时最新的 Ubuntu LTS 18.04 一起提供)。最低 SDK 为 14,目标为 26。构建工具版本为 27.0.3。

该应用程序构建并安装得很好,但是当它尝试使用其中一个类时,它会崩溃并出现异常:

Caused by: java.lang.NoClassDefFoundError: Failed resolution of: Ljava/time/LocalTime;

问题:

  • 是否java.time适用于支持 Java 8 的 Android 版本?
  • 如果是,最低 API 版本是多少?(我在Anbox上测试过,它支持API 25。)
  • 我还缺少什么吗?

android java-8 java-time

2
推荐指数
1
解决办法
226
查看次数

这是在Java线程安全(和GC安全)中的弱单独实现吗?

我想达到以下结果:

  • 我想只有一个类的实例.当有多个类的引用时,我希望它们都引用同一个实例.
  • 除非需要,否则我不想要实例.具体来说,我希望垃圾收集器能够在不使用时回收实例,并在下次请求实例时重新创建它.
  • 多个线程可以请求实例,因此操作必须是线程安全的.

这是我提出的代码:

public final class MyClass {
    private static WeakReference<MyClass> instance;
    public static synchronized MyClass getInstance() {
        if ((instance == null) || (instance.get() == null)) {
            instance = new WeakReference<MyClass>(new MyClass());
        }
        // TODO what if GC strikes here?
        return instance.get();
    }
}
Run Code Online (Sandbox Code Playgroud)

设计选择包括:

  • 延迟初始化,因此除非需要,否则不会创建实例
  • 该类将WeakReference保留给实例,以便实例在不再使用时可以进行垃圾回收.
  • getInstance()方法是synchronized(至MyClass),以便它一次只能由一个线程执行.

问题:

  • 这个设计是否会像我期望的那样表现并产生预期的结果?
  • 我是否必须担心getInstance()被评论所在的垃圾收集器打断(意味着垃圾收集器会收回我刚要返回的实例)?如果是这样,我该如何解决呢?

java singleton multithreading garbage-collection weak-references

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

指定方法参数必须从一个类继承并实现接口

我正在编写一个方法,要求其中一个参数来自特定的类(MyClass)并实现一个接口(MyInterface).

这样做的原因很简单

public void doStuff(MyClass arg0) {
    if (!(arg0 instanceof MyInterface))
        throw new IllegalArgumentException("arg0 must implement MyInterface");
    // do whatever we need to do
}
Run Code Online (Sandbox Code Playgroud)

请注意,MyClass这没有实现MyInterface,两者都是我按原样导入的类.

有没有更优雅的方式来做到这一点,最好是在构建时标记错误的方法?

java android

0
推荐指数
1
解决办法
55
查看次数