小编Mer*_*Mer的帖子

为什么try-with-resources catch块选择性地可选?

我读到catchtry-with-resources 中的块是可选的.我尝试Connection在try-with-resources块中创建一个对象,没有后续catch块,只是为了从eclipse中获取编译器错误:" SQLException自动close()调用引发的未处理异常类型."

由于可以在try-with-resources中使用的每个资源都实现AutoCloseable,因此在调用close()方法时可能抛出异常,我不明白该catch子句是如何可选的,因为它不允许我跳过捕获异常close().

是否有一些特殊要求,具体实现AutoCloseable不直接声明其close()方法中抛出的任何异常?(如覆盖AutoCloseableclose() throws Exception一个close()不抛出任何异常)?

..或者这可能只是一个日食问题?

编辑:这是仍然触发问题的最简单的代码片段:

try (Connection con = dataSource.getConnection()) {
  /*...*/

}
Run Code Online (Sandbox Code Playgroud)

关于这是否与使用JNDI数据源有关的想法?

提前致谢.

java try-with-resources autocloseable

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

T ...(泛型vararg参数)在编译时真的被剥离到Object []吗?

(我将在这里使用T来引用泛型参数,在参数化类中使用.)

我读到T...当用作参数时潜在的堆污染源的原因是编译器正常(不允许T[]数组)规则和允许T...(这是varargs,因此通常由varargs翻译)内部规则T[],除了泛型不允许)作为参数通过在内部实现它,就像它是一个原始类型,将其转换为数组Object[].

所以我写了一些代码来验证这一点,将这个概念融入我的记忆中.

我把T...t一个方法作为一个参数,然后System.out.println'd t.getClass[].我期望得上课Object[],但相反,我上了T[]课.

因此,似乎编译器正在转换T...tT[]内部,而不是转换为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 generics variadic-functions

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

为什么Java不支持从最终抛出异常时从try/catch中检索异常?

在Java 7中,该功能被添加到(通过getSuppressed())获取从try-with-resources语句的隐式finally块中抛出的异常.

似乎还没有一种方法(我知道)做相反的事情 - 当有一个显式的finally块并抛出异常时,屏蔽抛出的异常和try/catch中的异常.

为什么Java不提供通过类似机制获取这些隐藏/丢失异常的功能getSuppressed()

看起来这个功能的实现与在getSuppressed()链接异常中使用的功能类似,并且所提供的好处非常有用,但它仍然被排除在每个版本之外.

通过类似于的方法调用,程序员可以使用这些屏蔽异常的危险是什么getSuppressed()

(如果这个功能已经存在,请提前道歉,我只是无能为力.)

java exception try-catch-finally

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

为什么子类转换为父类型默认为私有实例方法的父版本,而不是其他实例方法?

我的理解是,子类型转换为父类型(如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)

java inheritance

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

WatchService WatchEvent .context() 方法为 ENTRY_MODIFY 上的文件返回不一致的相对路径(goutputstream-####,Linux 操作系统)

在此代码中,我希望使用给定路径内容的最新版本更新 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] …

java watchservice

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

如果枚举是隐式静态的,为什么他们能够在内部使用"this"关键字?

请原谅初学者级别的问题,但我对枚举的隐式静态状态感到困惑.

一方面,你不能在方法中声明它们,因为它们是隐式静态的,你可以像任何其他静态类一样从静态上下文引用它们.但另一方面,在内部,它们将自己称为"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.

我知道枚举是一种特殊的类型,但我仍然试图理解一些非常规怪癖的原因.

当引用枚举常量时,是否存在某种工厂模式类型的自动构造?它究竟在什么时候从静态类转变为实例?

谢谢!

java enums static

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

是否有相当于super.super()的东西?

我知道你可以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(祖父母)构造函数调用不可能的时候证明了这样做的原因?

java

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