我读到catchtry-with-resources 中的块是可选的.我尝试Connection在try-with-resources块中创建一个对象,没有后续catch块,只是为了从eclipse中获取编译器错误:" SQLException自动close()调用引发的未处理异常类型."
由于可以在try-with-resources中使用的每个资源都实现AutoCloseable,因此在调用close()方法时可能抛出异常,我不明白该catch子句是如何可选的,因为它不允许我跳过捕获异常close().
是否有一些特殊要求,具体实现AutoCloseable不直接声明其close()方法中抛出的任何异常?(如覆盖AutoCloseable的close() throws Exception一个close()不抛出任何异常)?
..或者这可能只是一个日食问题?
编辑:这是仍然触发问题的最简单的代码片段:
try (Connection con = dataSource.getConnection()) {
/*...*/
}
Run Code Online (Sandbox Code Playgroud)
关于这是否与使用JNDI数据源有关的想法?
提前致谢.
(我将在这里使用T来引用泛型参数,在参数化类中使用.)
我读到T...当用作参数时潜在的堆污染源的原因是编译器正常(不允许T[]数组)规则和允许T...(这是varargs,因此通常由varargs翻译)内部规则T[],除了泛型不允许)作为参数通过在内部实现它,就像它是一个原始类型,将其转换为数组Object[].
所以我写了一些代码来验证这一点,将这个概念融入我的记忆中.
我把T...t一个方法作为一个参数,然后System.out.println'd t.getClass[].我期望得上课Object[],但相反,我上了T[]课.
因此,似乎编译器正在转换T...t为T[]内部,而不是转换为Object[].
例如
public class MyClass<T>{
public void method(T...t)
{
System.out.println(t.getClass().getName()); //for MyClass<String>, this gives me
//[Ljava.lang.String
}
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么?如果编译器没有在内部转换泛型varargs参数Object[],它如何失去类型安全性并作为堆污染的潜在来源?
在Java 7中,该功能被添加到(通过getSuppressed())获取从try-with-resources语句的隐式finally块中抛出的异常.
似乎还没有一种方法(我知道)做相反的事情 - 当有一个显式的finally块并抛出异常时,屏蔽抛出的异常和try/catch中的异常.
为什么Java不提供通过类似机制获取这些隐藏/丢失异常的功能getSuppressed()?
看起来这个功能的实现与在getSuppressed()链接异常中使用的功能类似,并且所提供的好处非常有用,但它仍然被排除在每个版本之外.
通过类似于的方法调用,程序员可以使用这些屏蔽异常的危险是什么getSuppressed()?
(如果这个功能已经存在,请提前道歉,我只是无能为力.)
我的理解是,子类型转换为父类型(如Super sc = new Child();)将调用父类的静态方法,并访问父类的非隐藏字段,但会使用子类的实例方法.
对于私有实例方法(由于父方法是私有的,实际上不会发生覆盖的情况),这似乎不适用.)
我理解没有覆盖的事实(私有父方法对于孩子是不可见的,因此它们只能被隐藏.)意味着孩子不会查找层次结构以查看父方法的方法版本.从子进程调用实例方法.
然而,正如我所期望的那样(正在调用的孩子中出现的版本)正好相反.调用私有方法的父版本.
如果通常调用子项的实例方法,为什么会发生这种情况,并且在子项中,有一个方法具有相同的签名(method2()在这种情况下是完全匹配),在父项中隐藏相同的方法类?
package whatever;
public class A {
public void method1(){
System.out.println("A method1().");
}
//using "final" here to emphasize that this is a hiding, not an override.
private final void method2(){
System.out.println("A private method2().");
}
public static void main(String[] args)
{
A a = new A().new B();
a.method1(); //calls B method 1
((A.B)a).method1(); //calls B method 1
a.method2(); //calls A private method 2 **I expected it to call B …Run Code Online (Sandbox Code Playgroud) 在此代码中,我希望使用给定路径内容的最新版本更新 HashMap,并将绝对路径作为字符串用作键。问题是WatchEvent's 的.context()方法在每个事件上为我提供了相同文件的不同相对路径。
下面是一段代码:
else if(event.kind()==StandardWatchEventKinds.ENTRY_MODIFY)
{
/*Variable path is a Path of "//workspaces", set earlier.*/
Path oldfilepath=path.resolve((Path)event.context()); /*problem line*/
String oldfilepathstring = oldfilepath.toString();
FileReader oldIn = new FileReader(oldfilepathstring);
BufferedReader br = new BufferedReader(oldIn);
String line;
List<String> newfiletext=new LinkedList<>();
while((line = br.readLine())!=null)
newfiletext.add(line);
List<String> previousText=new LinkedList<>();
if((previousText = fileMappings.get(oldfilepathstring))!= null)
{
System.out.println("previoustext:\n"+previousText);
System.out.println("newfiletext:\n"+newfiletext);
}
fileMappings.put(oldfilepathstring, newfiletext);
System.out.println(fileMappings.keySet()+"\n"+fileMappings.values());
}
}
Run Code Online (Sandbox Code Playgroud)
这是b.txt将监视目录中的文件从内容“abc”修改为“abc 123”时的示例输出
请注意,所有这些都来自打开文件 /workspaces/b.txt(已经存在)并修改其内容。):
跑:
ENTRY_CREATE:.goutputstream-BRC1HX
ENTRY_MODIFY:.goutputstream-BRC1HX
[/workspaces/.goutputstream-BRC1HX]
[[]]
ENTRY_MODIFY:.goutputstream-BRC1HX
上一篇:
[]
新文件文本:
[ABC] … 请原谅初学者级别的问题,但我对枚举的隐式静态状态感到困惑.
一方面,你不能在方法中声明它们,因为它们是隐式静态的,你可以像任何其他静态类一样从静态上下文引用它们.但另一方面,在内部,它们将自己称为"this"as虽然他们是一个实例.
代码示例:
public class EnumTest {
enum Seasons{
SUMMER,
FALL,
WINTER,
SPRING;
public String toString()
{
switch(this)
{
case SUMMER:
return "Hot Summer";
case FALL:
return "Colorful Fall";
case WINTER:
return "Crisp Winter";
case SPRING:
return "Allergy Season";
default
return "wth?";
}
}
}
public static void main(String[] args)
{
System.out.println(EnumTest.Seasons.SUMMER.toString());
}
}
Run Code Online (Sandbox Code Playgroud)
注意如何在枚举定义中的toString()中,有一个关于"this"的开关.
在静态方法main中,以典型的静态类方式访问Enum.
我知道枚举是一种特殊的类型,但我仍然试图理解一些非常规怪癖的原因.
当引用枚举常量时,是否存在某种工厂模式类型的自动构造?它究竟在什么时候从静态类转变为实例?
谢谢!
我知道你可以super.super.methodName()用来调用祖父母的方法版本,但有没有办法在链式构造函数调用中直接调用祖父母类的构造函数?
(简体)示例:
class A {
public A(){}
public A(int i, boolean b) {
/*...*/
}
}
class B extends A {
public B(){}
public B(int i) {
super(i, true);
}
}
class C extends B {
public C(int i)
{
super.super(i,false); //This is not allowed, but you
//can see what I'm trying to do (call A(i,false).)
//this=new A(i,false); also doesn't work b/c this can't be LHS
//of assignment
}
}
Run Code Online (Sandbox Code Playgroud)
..或者这是不允许的,我是否只是在尝试在(父)超类中使一个super.superclass(祖父母)构造函数调用不可能的时候证明了这样做的原因?