在以前的java版本中,重新抛出异常被视为抛出catch参数的类型.
例如:
public static void test() throws Exception{
DateFormat df = new SimpleDateFormat("yyyyMMdd");
try {
df.parse("x20110731");
new FileReader("file.txt").read();
} catch (Exception e) {
System.out.println("Caught exception: " + e.getMessage());
throw e;
}
}
Run Code Online (Sandbox Code Playgroud)
在Java 7中,如果声明异常,则可以更精确地了解抛出的异常final:
//(doesn't compile in Java<7)
public static void test2() throws ParseException, IOException{
DateFormat df = new SimpleDateFormat("yyyyMMdd");
try {
df.parse("x20110731");
new FileReader("file.txt").read();
} catch (final Exception e) {
System.out.println("Caught exception: " + e.getMessage());
throw e;
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题:文档说我需要声明异常final.但如果我不这样做,上面的代码仍然编译和工作.我错过了什么吗?
参考文献:
我在eclipse中使用maven创建了一个webapp项目.当我在命令提示符下运行命令mvn package时,它显示以下错误.
[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?
[INFO] 1 error
[INFO] -------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 4.310s
[INFO] Finished at: Tue Mar 05 14:32:23 IST 2013
[INFO] Final Memory: 16M/218M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.0:compile (default-compile) on project Compilation fa
ilure
[ERROR] ***No compiler is provided in this environment. Perhaps you …Run Code Online (Sandbox Code Playgroud) 问题是我升级到Windows 10,现在我正在安装我的工具进行编程,现在我安装了Java的JDK 7,当我尝试在cmd中使用命令: - "javac"
结果是:"javac"未被识别为内部或外部命令......
但是我用jdk的正确链接编辑了PATH,因为当我使用"java"时,它没问题.
现在,我使用此命令在控制台中尝试: PATH=%PATH%;"C:\Program Files\Java\jdk1.7.0_79\bin"
当我执行此命令时,当我使用"javac"时,它可以工作,但现在,当我打开其他控制台时,它不起作用,或者当我重新启动控制台时,无法识别此命令.
可能是什么问题呢?
有人说每种编程语言都有其"复杂性预算",可用于实现其目的.但是,如果复杂性预算耗尽,每次微小变化都会变得越来越复杂,并且难以以向后兼容的方式实施.
从2010年8月开始阅读Lambda(≙Lambda表达式,异常透明度,防御方法和方法引用)的当前临时语法后,我想知道Oracle在考虑这些更改时是否完全忽略了Java的复杂性预算.
这些是我正在考虑的问题 - 其中一些更多是关于语言设计的:
谢谢!
例如,JDK 7能够切换(String)而不仅仅是switch(Number/Enum).
如果我写了一个在其代码中有switch(String)的GWT客户端,会有任何问题吗?
switch(String)是我能想到的问题之一.是否存在switch(String)之外的兼容性问题?
我正在进入Java7开发,我已经将JDK7添加到Java平台中,并在项目属性中选择了它.
但是当我编译时,我得到的信息如下:
warning: java/lang/Boolean.class(java/lang:Boolean.class): major version 51 is newer than 50, the highest major version supported by this compiler.
It is recommended that the compiler be upgraded.
Run Code Online (Sandbox Code Playgroud)
和
javac: invalid target release: 1.7
/Applications/NetBeans/NetBeans 7.1.app/Contents/Resources/NetBeans/harness/suite.xml:184: The following error occurred while executing this line:
/Applications/NetBeans/NetBeans 7.1.app/Contents/Resources/NetBeans/harness/common.xml:206: Compile failed; see the compiler error output for details.
Run Code Online (Sandbox Code Playgroud)
据我所知,Netbeans正在使用javac 1.6.如何更改为1.7?
我正在编写一个NetBeans平台应用程序,并在我设置的主应用程序属性中:Java Platform = JDK 1.7.在其中一个模块的属性中,我设置了Source level = 1.7.
我最近遇到了一个java中的错误,其中JList在使用鼠标更改值时将触发valueChanged()方法两次,并且在使用键盘更改值时仅触发一次.我刚刚在Oracle的网站上发现了一个关于此问题的错误(显然,这个错误超过了12年),我想知道是否有人可以向我解释为什么Oracle已经确定这不是缺陷(更不用说getValueIsAdjusting()在使用键盘时返回false.
对于有这个问题的任何人,我发现只是检查何时getValueIsAdjusting()是假的,然后运行我的方法的其余部分将解决问题.
如何通过MethodHandles.lookup()?获取所有声明的方法?如何获取所有声明的字段?
什么是差异MethodHandle.invoke(),MethodHandle.invokeExact()和MethodHandle.invokeWithArguments()
此外,我将非常感谢有关使用Methodhandle API for Java devloper的教程.我强调,我正在编写静态类型语言普通旧Java,我不是JVM开发人员,特别是我对整个字节码废话(invokedynamic)并不感兴趣.我想弄清楚如何使用这个新API而不是Java Core API.
EDITED-2:
@Glen Best下面提供了一些我只想提供的参考资料http://www.oraclejavamagazine-digital.com/javamagazine/20130102?pg=52&search_term=methodhandle&doc_id=-1#pg50这正是我想要的.我发现实际上有一些新的词汇表.例如,目标实际上是指MethodHandle(而不是发送的对象),而调用站点实际上是"调用""函数指针"又称MethodHandle的代码.此外,它是一定要了解MethodHandle API是不是更换为核心映像API,而不是suplement它.例如,您无法使用MethodHandle"发现"所有方法,而您需要Core Reflection API.但是当你"找到"你想要的方法时,你可以切换到MethodHandle,例如,绑定一些参数或者将它的签名"改变"(改编)为varargs.
编辑:
我仍在努力找出答案.我写了一些我想与大家分享的测试.
package alexander.berkovich;
import static org.junit.Assert.assertSame;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import org.junit.BeforeClass;
import org.junit.Test;
public class MethodHandlerCleanTest {
public static MethodHandles.Lookup lookup;
@BeforeClass
public static void asetUp(){
lookup = MethodHandles.lookup();
}
public static class Check {
public void primitive(final int …Run Code Online (Sandbox Code Playgroud) 我试图找到一种干净,代码高效的转换Optional<Integer>方式Optional<Long>.我正在使用Guava在Java 7中工作.
所以在代码中的一个地方我创建了一个可选的整数
Optional<Integer> optionalInt = Optional.fromNullable(someInt);
Run Code Online (Sandbox Code Playgroud)
在另一个领域,我需要它作为一个可选的长.我能想到的最好的事情是:
Optional<Long> optionalLong = optionalInt.transform(new Function<Integer, Long>() {
@Override
public Long apply(Integer inputInt) {
if (inputInt != null)
return inputInt.longValue();
else
return null;
}
});
Run Code Online (Sandbox Code Playgroud)
但这很麻烦,特别是如果你考虑在我使用原始类型时转换类型是多么容易.
有什么好主意吗?