Java语言是运行期绑定的,你定义的Class如果未被使用,即使编译过后运行期也不会被加载的所以编译器报错多半只是检查语法而已,另外会预先存储字符串等字面量,以方便运行期间更快的调用 而运行期报错是真正用到了Class的方法时才会发生举个简单的例子: public class Test{ public static A a; public static void main(String[] args){ try{ A.class.newInstance(); }catch(Exception e){}
//A aaa; //aaa.hello(); a.hello(); } } class A{ static{ System.out.println("Load class A"); double x = 3.0; double y = 0.0; System.out.println(x/y); } public void hello(){ System.out.println("Hello"); } } 建议在命令行用 java -verbose Test 来运行,可以清楚的看到JVM何时加载哪个类进来编译期异常就是注释掉的两行如果恢复,会无法通过编译,因为编译器警告局部变量没有初始化 运行期异常就是程序正常跑起来之后由于a没有初始化,调用a的hello方法抛出的空指针异常加了一个static块是想告诉你何时会初始化静态资源,真正实例化A的对象时才会初始化这个静态区域
1 你的代码不符合java的书写要求,语法错误
2 你需要的类库没有找到
3 某些可以预见的错误你没有处理,比如网络断开,数据库操作异常SQLExeption 等运行错
1 你的代码没有语法错误
2 你的某些错误,比如除以0,只有在运行的时候才可能发生
3 某些意外的发生,比如 空指针 nullpointerexception
而运行期报错是真正用到了Class的方法时才会发生举个简单的例子: public class Test{
public static A a;
public static void main(String[] args){
try{
A.class.newInstance();
}catch(Exception e){}
//A aaa;
//aaa.hello();
a.hello();
}
} class A{
static{
System.out.println("Load class A");
double x = 3.0;
double y = 0.0;
System.out.println(x/y);
} public void hello(){
System.out.println("Hello");
}
}
建议在命令行用 java -verbose Test 来运行,可以清楚的看到JVM何时加载哪个类进来编译期异常就是注释掉的两行如果恢复,会无法通过编译,因为编译器警告局部变量没有初始化
运行期异常就是程序正常跑起来之后由于a没有初始化,调用a的hello方法抛出的空指针异常加了一个static块是想告诉你何时会初始化静态资源,真正实例化A的对象时才会初始化这个静态区域
int或者double值除以double 0.0都不会抛出异常的,或者是Infinity,或者NaN等等
public static A a;
public static void main(String[] args){
try{
A.class.newInstance();
}catch(Exception e){}
//A aaa;
//aaa.hello();
a.hello();
}
} class A{
static{
System.out.println("Load class A");
double x = 3.0;
double y = 0.0;
System.out.println(x/y);
} public void hello(){
System.out.println("Hello");
}
}
运行的错误最典型的是空异常。null