我刚刚拿出几个月前写的一段代码。该代码从 Web 服务器获取 XML 文档并使用 JAXB 对其进行解析。上次我尝试时,效果非常好;现在我遇到了一个例外:
\n\norg.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)\nRun Code Online (Sandbox Code Playgroud)\n\n环顾四周,这表明 XML 标头数据存在一些问题,即<!DOCTYPE ...>. 答案表明该声明具有误导性:在所描述的情况下,systemId 完全丢失,尽管错误只是抱怨其前面缺少空格。
但是,如果我使用 Web 浏览器获取 XML 文档,它甚至不包含标<!DOCTYPE ...>头。
解析我几个月前检索到的 XML 文档没有出现任何问题。
\n\n如果我比较今天检索到的文档和几个月前的文档,则两者在根元素的开头都是完全相同的。
\njava.io.InputStream在尝试读取a 之前,Java是否有任何可靠的方法来确定a 是否关闭?
我的用例是我有一个接受InputStream参数并从中读取参数的方法。该方法在其自己的线程中运行,如果输入流关闭,我想终止该线程。
InputStreamImplements Closeable,它提供一种close()方法,但显然无法查询实例是否已关闭。
尝试从封闭状态读取InputStream将引发IOException,但可能还有其他原因,并且接口合同中没有任何内容说明这种情况是否永久存在,或者在某些情况下是否有可能在某个时候消失。
我的方法的调用者可以提供所需的任何子类InputStream,因此不能依靠特定的子类行为。
还有其他想法吗?
我的 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 版本?我想达到以下结果:
这是我提出的代码:
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)
设计选择包括:
getInstance()方法是synchronized(至MyClass),以便它一次只能由一个线程执行.问题:
getInstance()被评论所在的垃圾收集器打断(意味着垃圾收集器会收回我刚要返回的实例)?如果是这样,我该如何解决呢?java singleton multithreading garbage-collection weak-references
我正在编写一个方法,要求其中一个参数来自特定的类(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,两者都是我按原样导入的类.
有没有更优雅的方式来做到这一点,最好是在构建时标记错误的方法?