在Java 7中新的Try-with-Resources语法中,我是否需要担心资源的顺序?
try (InputStream in = loadInput(...); // <--- can these be in any order?
OutputStream out = createOutput(...) ){
copy(in, out);
}
catch (Exception e) {
// Problem reading and writing streams.
// Or problem opening one of them.
// If compound error closing streams occurs, it will be recorded on this exception
// as a "suppressedException".
}
Run Code Online (Sandbox Code Playgroud) 我的问题是关于Java 7中的泛型.假设我们有这样的类层次结构:
interface Animal {}
class Lion implements Animal {}
class Butterfly implements Animal {}
Run Code Online (Sandbox Code Playgroud)
我们还有一堂课
class Cage<T> {
private List<T> arr = new ArrayList<>();
public void add(T t) {
arr.add(t);
}
public T get() {
return arr.get(0);
}
}
Run Code Online (Sandbox Code Playgroud)
以下是使用该类的代码:
public static void main(String[] args) {
Cage<? extends Animal> cage = new Cage<>();
Animal a = cage.get(); //OK
cage.add(new Lion()); //Compile-time error
cage.add(new Butterfly()); //Compile-time error
}
Run Code Online (Sandbox Code Playgroud)
问题#1:
我在这里已经阅读过这些问题,但简直就是这样Cage<?>.但我告诉编译器<? extends …
我正在使用maven 3.0.4 , JRE 1.7.0_09. 当我使用mvn clean install所有测试通过并且一切看起来都很好 - 这是我的surefire插件配置:
<plugin>
<version>2.12.4</version>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<!-- -XX:-UseSplitVerifier is for java 7 -->
<argLine>-XX:-UseSplitVerifier</argLine>
</configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)
现在,当我的mvn cobertura:cobertura一些测试有这样的错误:
Expecting a stackmap frame at branch target ....
还有一些错误让我明白它没有使用JRE7运行(例如Encountered " "|" "| "" at line...)
这是我的cobertura插件配置:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>cobertura-maven-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<formats>
<format>html</format>
<format>xml</format>
</formats>
</configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)
报告是:
<reporting>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>cobertura-maven-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<formats>
<format>html</format>
<format>xml</format>
</formats>
</configuration>
</plugin>
</plugins>
</reporting>
Run Code Online (Sandbox Code Playgroud)
我看到很多线程谈论这个问题,解决方案是添加这一行, …
我正在开发一个Java应用程序,我需要使用一个名为的jar myBeans.jar.
这myBeans.jar包含许多使用jdk 1.7编译的类文件.我没有这些类文件的源代码.
我的整个应用程序使用的是jdk 1.6.我无法将其编译器更改为jdk 1.7.所以我希望我的jar与我的应用程序兼容.这就是为什么我希望用jdk 1.6编译jar的类.
现在我的问题是:有没有办法使用jdk 1.6编译类文件(而不是java文件)?
任何其他建议也欢迎.
有人建议我使用反编译器从类文件中获取源代码,然后使用jdk 1.6编译源代码.但是我最后会喜欢这个解决方案,因为有很多类文件.
我在Web应用程序启动时遇到异常,因为guice正在尝试构建所提到的类.
java.lang.VerifyError: Inconsistent stackmap frames at branch target 2770 in method com.aptusi.apps.magazine.api.servlet.internal.EditorServlet.service(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;Ljava/lang/String;Lcom/aptusi/persistence/runtime/framework/DboSession;)V at offset 200
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2483)
at java.lang.Class.getDeclaredConstructors(Class.java:1891)
at com.google.inject.spi.InjectionPoint.forConstructorOf(InjectionPoint.java:243)
at com.google.inject.internal.ConstructorBindingImpl.create(ConstructorBindingImpl.java:96)
at com.google.inject.internal.InjectorImpl.createUninitializedBinding(InjectorImpl.java:629)
at com.google.inject.internal.InjectorImpl.createJustInTimeBinding(InjectorImpl.java:845)
at com.google.inject.internal.InjectorImpl.createJustInTimeBindingRecursive(InjectorImpl.java:772)
at com.google.inject.internal.InjectorImpl.getJustInTimeBinding(InjectorImpl.java:256)
at com.google.inject.internal.InjectorImpl.getBindingOrThrow(InjectorImpl.java:205)
at com.google.inject.internal.InjectorImpl.getBinding(InjectorImpl.java:146)
at com.google.inject.internal.InjectorImpl.getBinding(InjectorImpl.java:66)
at com.google.inject.servlet.ServletDefinition.init(ServletDefinition.java:103)
at com.google.inject.servlet.ManagedServletPipeline.init(ManagedServletPipeline.java:82)
at com.google.inject.servlet.ManagedFilterPipeline.initPipeline(ManagedFilterPipeline.java:102)
at com.google.inject.servlet.GuiceFilter.init(GuiceFilter.java:172)`
Run Code Online (Sandbox Code Playgroud)
我知道-XX:-UseSplitVerifier和-noverify jvm选项,但我不想使用,因为我想确保这个项目中的所有代码至少是java版本7.
为了做到这一点,了解我的代码中究竟发生了什么是有用的,我不清楚所提到的200的偏移是什么,但是它可以与行号相关吗?
也有人知道一种方法,我可以找到我的类路径上的所有类的Java版本,我使用maven所以有很多依赖项,所以我正在寻找一种自动方式在类路径上查找任何类可能已编译为低于1.7的java版本?
我们的JSF Web应用程序基于java 7 se,JSF 2.1,使用Mojarra 2.1.27在Apache Tomcat 7.0.41及更低版本上运行良好.当我们尝试升级到Tomcat 7.0.42及更高版本时(我们已经尝试了每个版本高达7.0.50),在应用程序启动后,在第一次点击webapp中的任何URL时,我们在tomcat中看到以下错误日志:
我通过这个调试了,看起来Exception的来源是defaultFacesContext为null.
INFO: Server startup in 1591 ms
Feb 03, 2014 6:32:25 PM org.apache.catalina.core.StandardContext fireRequestDestroyEvent
SEVERE: Exception sending request initialized lifecycle event to listener instance of class com.sun.faces.config.ConfigureListener
java.lang.UnsupportedOperationException
at javax.faces.context.FacesContext.getExceptionHandler(FacesContext.java:287)
at javax.faces.event.ExceptionQueuedEventContext.getListenersForEventClass(ExceptionQueuedEventContext.java:262)
at com.sun.faces.application.ApplicationImpl.invokeComponentListenersFor(ApplicationImpl.java:2128)
at com.sun.faces.application.ApplicationImpl.publishEvent(ApplicationImpl.java:289)
at com.sun.faces.application.ApplicationImpl.publishEvent(ApplicationImpl.java:247)
at com.sun.faces.application.WebappLifecycleListener.requestDestroyed(WebappLifecycleListener.java:125)
at com.sun.faces.config.ConfigureListener.requestDestroyed(ConfigureListener.java:344)
at org.apache.catalina.core.StandardContext.fireRequestDestroyEvent(StandardContext.java:6151)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:207)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:409)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1044)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:313)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
Run Code Online (Sandbox Code Playgroud)
我用一个非常简单的应用程序重现了这个启动异常问题,只有一个静态JSF页面只有Hello World而没有支持bean,以及一个最小的web.xml,如下所示.在Tomcat 7.0.41上,一切都按预期工作,但总是会导致Tomcat 7.0.42+上出现以下错误. …
我在我的Java类中使用GroovyClassLoader来解析某个(理想情况下很复杂的)groovy文件(将在下一步执行):
在MyClass.java中调用
final Class parsedClass = groovyClassLoader.parseClass(groovyFile);
Run Code Online (Sandbox Code Playgroud)
知道:
GroovyFile.groovy进口
import com.my.import.one.Import1DTO
import com.my.import.two.Import2DTO
import com.my.import.three.Import3DTO
import com.my.import.four.Import4DTO
import com.my.import.five.Import5DTO
Run Code Online (Sandbox Code Playgroud)
当调用parseClass方法时,此异常引发:
例外
unable to resolve class com.my.import.one.Import1DTO;
unable to resolve class com.my.import.two.Import2DTO;
unable to resolve class com.my.import.three.Import3DTO;
unable to resolve class com.my.import.four.Import4DTO;
unable to resolve class com.my.import.five.Import5DTO;
Run Code Online (Sandbox Code Playgroud)
在解析基类之前,我是否可以获得我期望的行为而不解析每个导入类?
谢谢!
假设我有两节课
class A {
private String aStr;
@Override
public int hashCode() {
return Objects.hash(aStr);
}
}
Run Code Online (Sandbox Code Playgroud)
和
class B extends A {
private String bStr;
@Override
public int hashCode() {
return Objects.hash(bStr);
}
}
Run Code Online (Sandbox Code Playgroud)
作为类的领域A中仍然字段B需要被散列,我该如何正确地包含的字段的哈希码A的B.hashCode()?这些都是?
Objects.hash(bStr) + super.hashCode();
// these generate a StackOverflowError:
Objects.hash(bStr, (A) this);
Objects.hash(bStr, A.class.cast(this));
Run Code Online (Sandbox Code Playgroud) 我有这段代码:
void timerCountDown(){
while(RaftNode.getTimeoutVar()){
long x = System.currentTimeMillis();
if(x >= RaftNode.limit){
System.out.println(x);
System.out.println(RaftNode.limit + " THIS SHOULD BE LESS THAN");
System.out.println(System.currentTimeMillis() + " THIS");
System.out.println("TIMED OUT");
raft.RaftNode.setTimeoutVar(false);
nextRandomTimeOut();
raft.RaftNode.onTimeOut();
}
}
}
Run Code Online (Sandbox Code Playgroud)
所以基本上,这是一个超时功能,超时由另一个条件刷新.我的问题是x> = RaftNode.limit条件保持触发,即使它是假的(通过print语句).
我的控制台输出:
1431532870542
1431532872508 THIS SHOULD BE LESS THAN
1431532870542 THIS
Run Code Online (Sandbox Code Playgroud)
因此x确实是当前时间,但即使它小于限制,也会触发条件.
我不知道为什么!
限制变量是
public static long limit;
Run Code Online (Sandbox Code Playgroud)
所以没什么好奇的
我需要java.security在Windows 7主机上找到并编辑文件。它在默认的Oracle JRE安装中位于何处?
java-7 ×10
java ×6
maven ×2
.class-file ×1
cobertura ×1
compilation ×1
generics ×1
groovy ×1
groovyshell ×1
hash ×1
hashcode ×1
if-statement ×1
java-6 ×1
java-8 ×1
jenkins ×1
jsf-2 ×1
jsf-2.2 ×1
mojarra ×1
tomcat7 ×1
verification ×1
verifyerror ×1
windows ×1