相关疑难解决方法(0)

静态和非静态初始化代码块之间有什么区别

我的问题是静态关键字的一个特定用法.可以使用static关键字来覆盖不属于任何函数的类中的代码块.例如,以下代码编译:

public class Test {
    private static final int a;    
    static {
        a = 5;
        doSomething(a);
    }
    private static int doSomething(int x) {
        return (x+5);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你删除static它抱怨的关键字,因为变量afinal.但是,可以删除两个finalstatic关键字并使其编译.

这两种方式让我感到困惑.我怎么能有一个不属于任何方法的代码部分?如何调用它?一般来说,这种用法的目的是什么?或者更好,我在哪里可以找到关于此的文档?

java static static-initializer

345
推荐指数
8
解决办法
23万
查看次数

从包含utf 8字符的属性文件中读取

我正在读取一个属性文件,该文件由UTF-8字符集中的消息组成.

问题

输出格式不正确.我正在使用InputStream.

属性文件看起来像

username=LBSUSER
password=Lbs@123
url=http://localhost:1010/soapfe/services/MessagingWS
timeout=20000
message=Spanish character are = {á é í, ó,ú ,ü, ñ, ç, å, Á, É, Í, Ó, Ú, Ü, Ñ, Ç, ¿, °, 4° año = cuarto año, €, ¢, £, ¥}
Run Code Online (Sandbox Code Playgroud)

我正在读这样的文件,

Properties props = new Properties();
props.load(new FileInputStream("uinsoaptest.properties"));
String username = props.getProperty("username", "test");
String password = props.getProperty("password", "12345");
String url = props.getProperty("url", "12345");
int timeout = Integer.parseInt(props.getProperty("timeout", "8000"));
String messagetext = props.getProperty("message");
System.out.println("This is soap msg : " + …
Run Code Online (Sandbox Code Playgroud)

java encoding parsing utf-8

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

什么是Java中的<init>方法?它可以被覆盖吗?

<init>例如,可以在stacktrace中找到方法.据我所知,它代表了在构造函数中完成的初始化.

如果你试图执行

Object.class.getDeclaredMethod("<init>");
Run Code Online (Sandbox Code Playgroud)

你会得到的java.lang.NoSuchMethodException.

这个方法是什么?什么时候加入课堂?(在编译中 - 执行术语)它是虚拟的,无论如何都可以覆盖它吗?

java initialization

12
推荐指数
2
解决办法
3万
查看次数

混合使用Log4j和commons-logging会导致"类加载死锁"?

我认为我发现了一种情况,即混合使用log4j a)直接和b)通过commons-logging导致某种类加载死锁.我不确定这种情况是否可行(JVM是否应该检测到这种情况?)以及如何处理它.

问题

在我们的构建系统中,我们目前正在按顺序运行单元测试 - 为了使构建更快,我们显然可以改变它以并行运行我们的单元测试.但是,如果我们这样做,一些构建会遇到执行超时.在分析这种"悬挂构建"的线程转储时,我们发现自己处于不同的模块中,大多数时间都涉及不同的测试.但它总是归结为两个线程尝试初始化一个Logger:一个用Logger.getLogger(直接使用log4j),另一个用LogFactory.getLog(使用commons-logging).

我的分析

所以我们在这个地方有一个线程(直接使用log4j的线程):

"pool-1-thread-3" prio=10 tid=0x00007f6528ca6000 nid=0x6f8f in Object.wait() [0x00007f64d9ca6000]
  java.lang.Thread.State: RUNNABLE
at org.apache.log4j.LogManager.<clinit>(LogManager.java:82)
at org.apache.log4j.Logger.getLogger(Logger.java:117)
at de.is24.platform.contacts.domain.PhoneNumberFormat.<clinit>(PhoneNumberFormat.java:21)
Run Code Online (Sandbox Code Playgroud)

不幸的是,这是一个相当"拥挤"的路线:

Hierarchy h = new Hierarchy(new RootLogger((Level) Level.DEBUG));
Run Code Online (Sandbox Code Playgroud)

另一个线程(使用commons-logging)在这里等待:

"pool-1-thread-2" prio=10 tid=0x00007f6528bf9800 nid=0x6f8e in Object.wait() [0x00007f64d9da7000]
  java.lang.Thread.State: RUNNABLE
at org.apache.log4j.Priority.<clinit>(Priority.java:45)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:171)
at org.apache.commons.logging.impl.Log4JLogger.class$(Log4JLogger.java:37)
at org.apache.commons.logging.impl.Log4JLogger.<clinit>(Log4JLogger.java:45)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at org.apache.commons.logging.impl.LogFactoryImpl.newInstance(LogFactoryImpl.java:529)
at org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:235)
at org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:209)
at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:351)
Run Code Online (Sandbox Code Playgroud)

这很简单:

final static public Priority FATAL = …
Run Code Online (Sandbox Code Playgroud)

java multithreading deadlock log4j apache-commons-logging

10
推荐指数
1
解决办法
2300
查看次数

静态变量与非静态变量

我定义了一个对象并声明了一个静态变量i.在该get()方法中,当我尝试打印实例和类变量时,两者都打印相同的值.

不是this.i实例变量吗?它应该打印0而不是50吗?

public class test {
    static int i = 50;
    void get(){
        System.out.println("Value of i = " + this.i);
        System.out.println("Value of static i = " + test.i);
    }

    public static void main(String[] args){
        new test().get();
    }

}
Run Code Online (Sandbox Code Playgroud)

java

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